阅读了许多类似的主题后,我看不到问题的原因...
我正在尝试学习如何使用节点创建RESTful API并表达4,非常基本和简单,但是当我尝试使用POST请求保存我的文档时,没有req.body在请求上发送并且我遇到了一些问题。
让我们看一小段代码:
module.exports = (router, Bear) ->
router.route '/bears'
.get (req, res) ->
Bear.find (err, bears) -> if err then err else res.json bears
.post (req, res) ->
newBear =
_id: req.body.bearId
nombre: req.body.nombre
bear = new Bear(newBear)
bear.save (err) ->
if err then res.send err
# res.json msg: "#{bear.nombre}, creado"
res.json msg: "created"
到目前为止,这是我的基本路由配置(目前)。服务器是:
express = require 'express'
app = express()
morgan = require 'morgan'
bodyParser = require 'body-parser'
mongoose = require 'mongoose'
app.use bodyParser.urlencoded extended: true
app.use bodyParser.json()
app.use morgan 'dev'
require('./app/config/js/database')(mongoose)
router = express.Router()
Bear = require './app/models/js/bear'
router.get '/', (req, res) -> res.json msg: 'It works'
require('./app/routes/js/bears')(router, Bear)
app.use '/api', router
port = 8080
app.listen(port)
console.log("Corriendo en #{port}")
而且其他代码段在这里不相关(我认为),因此,当我使用邮递员或CURL发送请求时,我总是{}
在服务器上收到响应和崩溃消息:
home/nano/Dev/bears/node_modules/mongoose/lib/utils.js:413
throw err;
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:689:11)
at ServerResponse.header (/home/nano/Dev/bears/node_modules/express/lib/response.js:662:10)
at ServerResponse.send (/home/nano/Dev/bears/node_modules/express/lib/response.js:146:12)
at ServerResponse.json (/home/nano/Dev/bears/node_modules/express/lib/response.js:235:15)
at Promise.<anonymous> (/home/nano/Dev/bears/app/routes/js/bears.js:22:20)
at Promise.<anonymous> (/home/nano/Dev/bears/node_modules/mongoose/node_modules/mpromise/lib/promise.js:172:8)
at Promise.emit (events.js:95:17)
at Promise.emit (/home/nano/Dev/bears/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
at Promise.reject (/home/nano/Dev/bears/node_modules/mongoose/node_modules/mpromise/lib/promise.js:111:15)
at Promise.error (/home/nano/Dev/bears/node_modules/mongoose/lib/promise.js:95:15)
真的我不知道我真的不知道该怎么办,我整个下午到深夜都在做这个。
好吧,我在代码中进行了更改,现在回溯消失了,但请求仍然为空。
module.exports = (router, Bear) ->
router.route '/bears'
.get (req, res) ->
Bear.find (err, bears) ->
if err then return res.send err
res.json bears
.post (req, res) ->
newBear =
_id: req.body.bearId
nombre: req.body.nombre
bear = new Bear(newBear)
bear.save (err) ->
if err then return res.send err
res.json msg: "created"
JS代码:
(function() {
module.exports = function(router, Bear) {
return router.route('/bears').get(function(req, res) {
return Bear.find(function(err, bears) {
if (err) {
return res.send(err);
}
return res.json(bears);
});
}).post(function(req, res) {
var bear, newBear;
newBear = {
_id: req.body.bearId,
nombre: req.body.nombre
};
bear = new Bear(newBear);
return bear.save(function(err) {
if (err) {
return res.send(err);
}
return res.json({
msg: "created"
});
});
});
};
}).call(this);
我正在通过RESTClient发送用于Firefox,Curl,Postman的请求...内容类型标头是 Content-Type: application/json; charset=utf-8
如果您注释掉:
Bear = require './app/models/js/bear'
并替换:
require('./app/routes/js/bears')(router, Bear)
和:
router.post "/bears", (req, res, next) ->
console.log req.body
res.json req.body
return
您会看到req.body正在通过。
如评论中所述,您的bears.coffee路由文件中缺少返回陈述。您需要更改第12行,使其显示为:
if err then return res.send err
确保您在请求的正文中发送参数。对于卷曲,应使用:
curl -X POST -d "bearId=1221&nombre=papa" http://localhost:8080/api/bears
对于Postman,请确保从下拉列表中选择POST,然后单击x-www-form-urlencoded,然后将参数分别放在“键”和“值”字段中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句