node.js - 如何在 node.js 中为单独的路由文件和 api 文件更正我的代码
问题描述
目前,我有这个用户模块的 3 个文件
- routers/user.js(到目前为止,所有路由器功能都驻留在此文件中,我想在 userServiceAPI.js 中将它们分开)
- 模型/user.js
- userserviceAPI.js(我需要帮助)
这是我的路由器/user.js
const express = require('express')
const User = require('../models/user')
const userModel=require('../models/user')
const router = new express.Router()
const multer = require('multer')
const userApi = require('../services/userservice.api')
//const sharp = require('sharp')
const auth = require('../db/auth')
//My trial code for separate API file
router.post('/addUser',userApi.addUser)
router.post('/users', async (req, res) => {
const user = new User(req.body)
try {
await user.save()
const token = await user.generateAuthToken()
res.status(201).send({ user, token })
} catch (e) {
res.status(400).send(e)
}
})
router.post('/users/login', async (req, res) => {
try {
const user = await User.findByCredentials(req.body.email, req.body.password)
const token = await user.generateAuthToken()
res.send({ user, token })
} catch (e) {
res.status(400).send()
}
})
router.post('/users/logout', auth, async (req, res) => {
try {
req.user.tokens = req.user.tokens.filter((token) => {
return token.token !== req.token
})
await req.user.save()
res.send()
} catch (e) {
res.status(500).send()
}
})
router.post('/users/logoutAll', auth, async (req, res) => {
try {
req.user.tokens = []
await req.user.save()
res.send()
} catch (e) {
res.status(500).send()
}
})
router.get('/users/me', auth, async (req, res) => {
res.send(req.user)
})
router.patch('/users/me', auth, async (req, res) => {
const updates = Object.keys(req.body)
const allowedUpdates = ['name', 'email', 'password', 'age']
const isValidOperation = updates.every((update) => allowedUpdates.includes(update))
if (!isValidOperation) {
return res.status(400).send({ error: 'Invalid updates!' })
}
try {
updates.forEach((update) => req.user[update] = req.body[update])
await req.user.save()
res.send(req.user)
} catch (e) {
res.status(400).send(e)
}
})
router.delete('/users/me', auth, async (req, res) => {
try {
await req.user.remove()
res.send(req.user)
} catch (e) {
res.status(500).send()
}
})
const upload = multer({
limits: {
fileSize: 1000000
},
fileFilter(req, file, cb) {
if (!file.originalname.match(/\.(jpg|jpeg|png)$/)) {
return cb(new Error('Please upload an image'))
}
cb(undefined, true)
}
})
router.post('/users/me/avatar', auth, upload.single('avatar'), async (req, res) => {
const buffer = await sharp(req.file.buffer).resize({ width: 250, height: 250 }).png().toBuffer()
req.user.avatar = buffer
await req.user.save()
res.send()
}, (error, req, res, next) => {
res.status(400).send({ error: error.message })
})
router.delete('/users/me/avatar', auth, async (req, res) => {
req.user.avatar = undefined
await req.user.save()
res.send()
})
router.get('/users/:id/avatar', async (req, res) => {
try {
const user = await User.findById(req.params.id)
if (!user || !user.avatar) {
throw new Error()
}
res.set('Content-Type', 'image/png')
res.send(user.avatar)
} catch (e) {
res.status(404).send()
}
})
module.exports = router
这是我的userserviceAPI.js
const express = require('express')
const userModel = require('../models/user')
const router = new express.Router()
const multer = require('multer')
const auth = require('../db/auth')
const addUser = (req, res, next) => {
const user = new userModel(req.body)
const token = user.generateAuthToken()
userModel.create(req.body, (err, result) => {
if (err) return res.status(400).json({ message: 'Please enter correct information.' })
if (result) {
return res.status(200).send({ user, token }).json({result : result})
}
})
}
module.exports = {
addUser
}
这是完美执行我能够从邮递员添加数据我的数据成功显示在 Robo 3T 中,但在可视终端中出现以下错误消息:
(node:819) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
Server is up on port 3000
events.js:187
throw er; // Unhandled 'error' event
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:485:11)
at ServerResponse.header (/Users/ruksz/Desktop/E-comm/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/Users/ruksz/Desktop/E-comm/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/Users/ruksz/Desktop/E-comm/node_modules/express/lib/response.js:267:15)
at /Users/ruksz/Desktop/E-comm/services/userservice.api.js:13:58
at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
at Function.<anonymous> (/Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:4855:21)
at _done (/Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:3071:12)
at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:3080:18
at callbackWrapper (/Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:3036:11)
at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:4832:16
at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:4855:21
at model.<anonymous> (/Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:496:7)
at /Users/ruksz/Desktop/E-comm/node_modules/kareem/index.js:315:21
at next (/Users/ruksz/Desktop/E-comm/node_modules/kareem/index.js:209:27)
Emitted 'error' event on Function instance at:
at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:4834:13
at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:4855:21
[... lines matching original stack trace ...]
at next (/Users/ruksz/Desktop/E-comm/node_modules/kareem/index.js:209:27)
at /Users/ruksz/Desktop/E-comm/node_modules/kareem/index.js:182:9
at /Users/ruksz/Desktop/E-comm/node_modules/kareem/index.js:507:38
at processTicksAndRejections (internal/process/task_queues.js:75:11)
[nodemon] app crashed - waiting for file changes before starting...
我要做的就是将此路由器 API 分离到另一个文件中。提前致谢。
解决方案
所以这里有两个问题:
将您的行替换
userModel.create(req.body, (err, result) => {
为return userModel.create(req.body, (err, result) => {
您在电子邮件 ID 上有一个唯一键,并且您正在尝试插入重复的电子邮件,这就是您收到
email_1 dup key: { email: "hera@gmail.com" }
错误的原因。添加检查以查找重复的电子邮件 ID。
推荐阅读
- c++ - 在 openssl 中验证证书时忽略公用名
- javascript - console.error: React Native 版本不匹配
- android - 运行调试器时解析 XML 并获得不同的结果,与仅运行
- java - 在应用程序中保留模拟的按键(java)
- vb.net - 如何获取 WCF 在 IIS 上托管的虚拟路径而不是物理路径?
- javascript - Mocha 忽略现有的 .mocharc.js 配置文件
- python - 遍历具有多个值的列表并计算平均值
- single-page-application - 在单页应用程序上处理 svelte 上的 window.scrollTo
- python - 如何使用 Python 为 Telegram 机器人中的每个 InlineKeyboardButton 获取特定操作?
- c# - 如何从 Azure 云 shell C# 检查资源组的内容?