gpt4 book ai didi

node.js - Res.send() 之后的 ExpressJS 4 执行函数

转载 作者:搜寻专家 更新时间:2023-11-01 00:01:39 25 4
gpt4 key购买 nike

我是 nodeJS 和异步编程的新手。我使用 express 作为我的应用程序的基础,实际上只有一条路线可以提供页面并接受来自表单的上传。我想在文件上传后向外部服务发出 POST 请求。尝试在 res.send(200) 之后执行任何代码会导致错误消息 Error: Can't set headers after they are sent.

我正在使用 request将帖子发送到外部服务的包。

var express = require('express');
var router = express.Router();
var util = require("util");
var request = require("request");

/* POST uploads. */
router.post('/', function(req, res, next) {
console.log("LOG:" + util.inspect(req.files));
res.send('respond with a resource');
postFile(req.files.file.path);
});

var postFile = function(path) {
var opts = {
method: 'POST',
uri: 'https://example.com/api/files.upload',
formData: {
token: "xxx",
file: fs.createReadStream(req.files.file.path)
}
}

// console.log("LOG:\n" + util.inspect(opts));

request.post(opts, function(error, response, body) {
if (error) {
console.log("ERROR LOG: " + util.inspect(error));
} else {
console.log("RESPONSE LOG:" + util.inspect(response));
}
});
}

module.exports = router;

postFile 函数本身运行良好,甚至在 res.send 之后直接添加 console.log 也会导致相同的错误。如何在响应发送到客户端后继续在服务器上执行代码?

从 Node 输出日志:

POST/上传 200 85.201 毫秒 - 23
错误:发送后无法设置 header 。
在 ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
在 ServerResponse.header (/Users/jason/dev/test/file-share/node_modules/express/lib/response.js:700:10)
在 ServerResponse.send (/Users/jason/dev/test/file-share/node_modules/express/lib/response.js:154:12)
在 fn (/Users/jason/dev/test/file-share/node_modules/express/lib/response.js:934:10)
在 View.exports.renderFile [作为引擎] (/Users/jason/dev/test/file-share/node_modules/jade/lib/index.js:374:12)
在 View.render (/Users/jason/dev/test/file-share/node_modules/express/lib/view.js:93:8)
在 EventEmitter.app.render (/Users/jason/dev/test/file-share/node_modules/express/lib/application.js:566:10)
在 ServerResponse.res.render (/Users/jason/dev/test/file-share/node_modules/express/lib/response.js:938:7)
在/Users/jason/dev/test/file-share/app.js:58:7
在 Layer.handle_error (/Users/jason/dev/test/file-share/node_modules/express/lib/router/layer.js:58:5)

最佳答案

下面的代码没有问题,响应请求后就可以执行代码了。您只是不能再次发送 header 。

router.post('/', function(req, res, next) {
console.log("LOG:" + util.inspect(req.files));
res.send('respond with a resource');
postFile(req.files.file.path);
});

使用 request POST 或 GET 不会响应您的请求,除非您愿意。

关于node.js - Res.send() 之后的 ExpressJS 4 执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28868842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com