我正在尝试创建CRUD。我已经创建了UPDATE,但是当我尝试向邮递员请求时,出现以下错误:
错误[ERR_HTTP_HEADERS_SENT]:发送标头后无法设置标头给客户在ServerResponse.setHeader(_http_outgoing.js:526:11)在ServerResponse.header(E:\ freebooks-core-api \ node_modules \ express \ lib \ response.js:771:10)在ServerResponse.send(E:\ freebooks-core-api \ node_modules \ express \ lib \ response.js:170:12)在ServerResponse.json(E:\ freebooks-core-api \ node_modules \ express \ lib \ response.js:267:15)在ServerResponse.send(E:\ freebooks-core-api \ node_modules \ express \ lib \ response.js:158:21)在Object.exports.success(E:\ freebooks-core-api \ network \ response.js:3:6)在E:\ freebooks-core-api \ components \ book \ network.js:32:18在processTicksAndRejections(internal / process / task_queues.js:97:5)上{代码:'ERR_HTTP_HEADERS_SENT'}(节点:2844)UnhandledPromiseRejectionWarning:错误[ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头在ServerResponse.setHeader(_http_outgoing.js:526:11)在ServerResponse.header(E:\ freebooks-core-api \ node_modules \ express \ lib \ response.js:771:10)在ServerResponse.send(E:\ freebooks-core-api \ node_modules \ express \ lib \ response.js:170:12)在ServerResponse.json(E:\ freebooks-core-api \ node_modules \ express \ lib \ response.js:267:15)在ServerResponse.send(E:\ freebooks-core-api \ node_modules \ express \ lib \ response.js:158:21)在Object.exports.error(E:\ freebooks-core-api \ network \ response.js:12:6)在E:\ freebooks-core-api \ components \ book \ network.js:34:16在processTicksAndRejections(内部/进程/task_queues.js:97:5)(节点:2844)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个由抛出异步函数引起的错误没有障碍,或者拒绝了没有处理的承诺使用.catch()。根据未处理的诺言终止节点进程拒绝,请使用CLI标志
--unhandled-rejections=strict
(请参见https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。(拒绝ID:1)(节点:2844)[DEP0018] DeprecationWarning:未处理答应拒绝已弃用。将来,承诺会被拒绝没有处理的将终止Node.js进程非零退出代码。当我读到错误时,它来自以下文件:
response.js
在我的网络文件夹中在我的书(组件)文件夹中:exports.success = function (req, res, data, status) { res.status(status || 200) .send({ error: '', data }) } exports.error = function (req, res, error, status, log) { console.log(log) res.status(status || 500) .send({ error, data: '' }) }
和network.js
并且错误在该行上运行,因此代码如下:const router = require('express').Router() const response = require('../../network/response') const controller = require('./controller') router.get('/', function (req, res) { controller.getBooks() .then( data => { response.success(req, res, data, 200) }) .catch( err => { response.error(req, res, 'Unexpected Error', 500, err) }) }) router.post('/', function (req, res) { const book = req.body console.log(book) controller.addBook(book).then( data => { response.success(req, res, book, 201) }) .catch(err => { response.error(req, res, 'Internal error', 500, err) }) }) router.patch('/:id', function(req, res) { const { id } = req.params console.log(id) const book = req.body controller.updateBook(id, book) .then( data => { response.success(req, res, data, 200) }).catch( err => { response.error(req, res, 'Internal error', 500, err) }) res.send('Ok') }) module.exports = router
但是由于我正在调用controller
const store = require('./store') function getBooks () { return new Promise((resolve, reject) => { resolve(store.list()) }) } function addBook (book) { return new Promise((resolve, reject) => { if (!book) { reject('I reject') return false } else { resolve(book) store.add(book) } }) } function updateBook (id, book) { return new Promise( async (resolve, reject) => { if (!id || !book) { reject('Invalid data') return false } else { const result = await store.update(id, book) resolve(result) } }) } function deleteBook (id) { return new Promise( async (resolve, reject) => { if (!id) { reject('Invalid data') return false } else { const result = await store.update(id) resolve(result) } }) } module.exports = { addBook, getBooks, updateBook, deleteBook }
最后是store
const db = require('mongoose') const Model = require('./model') db.Promise = global.Promise db.connect(`mongodb+srv://fewtwtwfwe:efwefwecwecw@ferwrtervsefwg/test?retryWrites=true&w=majority`, { useNewUrlParser: true, useUnifiedTopology: true }).then( () => { console.log(`Database connected`) }).catch( err => { console.error(err) }) function addBook(book) { const myBook = new Model(book) myBook.save() } async function getBooks() { const books = await Model.find() return books } async function updateBook(id, book) { const foundBook = await Model.findOne({ '_id':id }) foundBook.book = book const newBook = await foundBook.save() return newBook } async function deleteBook(id) { const foundBook = await Model.findOne({ '_id':id }) } module.exports = { add: addBook, list: getBooks, update: updateBook, delete: deleteBook, }
我修改了与数据库的连接数据,因为我确定错误不会出在这里,我已经提出了其他请求,显然一切都很好。有什么主意吗?
我正在尝试创建CRUD。我已经创建了UPDATE,但是当我尝试向邮递员请求时,出现以下错误:错误[ERR_HTTP_HEADERS_SENT]:发送标头后无法设置标头...
您只能为每个传入请求发送一个响应。此特定的错误消息告诉您您的代码正在尝试发送两个请求。通常,这是由于使用异步功能对代码进行不正确的排序而发生的。这条路线似乎是这样: