我正在学习一本关于 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,
trim: true,
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, authCtrl.hasAuthorization, 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 中成功创建。我需要帮助来解决这个问题。提前致谢。