如何解决向 API 端点发送发布请求时出错
我正在学习一本关于 MERN 项目的书,在测试源代码时遇到了这个问题。
我有这个代码:
/config.config.js
const config = {
env: process.env.NODE_ENV || 'development',port: process.env.PORT || 3000,jwtSecret: process.env.JWT_SECRET || "YOUR_secret_key",mongoUri: process.env.MONGODB_URI ||
process.env.MONGO_HOST ||
'mongodb://' + (process.env.IP || 'localhost') + ':' +
(process.env.MONGO_PORT || '27017') +
'/mernproject' }
export default config
/server/controllers/user.controller.js
import User from '../models/user.model'
import extend from 'lodash/extend'
import errorHandler from '../helpers/dbErrorHandler'
const create = async (req,res,next) => {
const user = new User(req.body)
try {
await user.save()
return res.status(200).json({
message: "Succesfully signed up!"
})
} catch (err) {
return res.status(400).json({
error: errorHandler.getErrorMessage(err)
})
}
}
export default {create}
/helpers/dbErrorHandlers.js
const getErrorMessage = (err) => {
let message = ''
if (err.code) {
switch (err.code) {
case 11000:
case 11001:
message = getUniqueErrorMessage(err)
break
default:
message = 'Something went wrong'
}
}
else {
for (let errName in err.errors) {
if (err.errors[errName].message)
message = err.erros[errName].message
}
}
return message
}
const getUniqueErrorMessage = (err) => {
let output
try {
let fieldName =
err.message.substring(err.message.lastIndexOf('.$') + 2,err.message.lastIndexOf('_1'))
output = fieldName.chartAt(0).toUpperCase() + fieldName.slice(1) +
' already exists'
} catch (ex) {
output = 'Unique field already exists'
}
return output
}
export default {getErrorMessage}
/models/user.model.js
import mongoose from 'mongoose'
const UserSchema = new mongoose.Schema({
name: {
type: String,trim: true,required: 'Name is required'
},email: {
type: String,unique: 'Email already exists',match: [/.+\@.+\..+/,'Please fill a valid email address'],required: 'Email is required'
},created: {
type: Date,default: Date.now
},updated: Date,hashed_password: {
type: String,required: "Password is required"
},salt: String
})
UserSchema
.virtual('password')
.set(function(password) {
this._password = password
this.salt = makeSalt()
this.hashed_password = this.encryptPassword(password)
})
.get(function() {
return this._password
})
UserSchema.path('hashed_password').validate(function(v) {
if (this._password && this._password.length < 6) {
this.invalidate('password','password must be at least 6 characters.')
}
if (this.isNew && !this._password) {
this.invalidate('password','Password is required')
}
},null)
UserSchema.methods = {
authenticate: function(plainText) {
return this.encryptPassword(plainText) === this.hashed_password
},encryptPassword: function(password) {
if (!password) return ''
try {
return crypto
.createHmac('sha1',this.salt)
.update(password)
.digest('hex')
} catch (err) {
return ''
}
},makeSalt: function() {
return Math.round((new Date().valueOf() * Math.random())) + ''
}
}
export default mongoose.model('User',UserSchema)
/routes/user.routes.js
import express from 'express'
import useCtrl from '../controllers/user.controller'
import authCtrl from '../controllers/auth.controller'
const router = express.Router()
router.route('api/users')
.get(useCtrl.list)
.post(useCtrl.create)
router.route('/api/users/:userId')
.get(authCtrl.requireSignin,useCtrl.read)
.put(authCtrl.requireSignin,authCtrl.hasAuthorization,useCtrl.update)
.delete(authCtrl.requireSignin,useCtrl.remove)
router.param('userId',useCtrl.userByID)
export default router
/server.js
import config from './../config/config'
import app from './express'
import mongoose from 'mongoose'
mongoose.Promise = global.Promise
mongoose.connect(config.mongoUri,{ useNewUrlParser: true,useCreateIndex: true,useUnifiedTopology: true } )
mongoose.connection.on('error',() => {
throw new Error(`unable to connect to database: ${mongoUri}`)
})
app.listen(config.port,(err) => {
if (err) {
console.log(err)
}
console.info('Server started on port %s.',config.port)
})
问题是在测试对 API 端点的 post 请求时,我收到“错误 404 未找到”。数据库 (mernproject) 和模型 (Users) 在 mongodb 中成功创建。我需要帮助来解决这个问题。提前致谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。