gpt4 book ai didi

javascript - 我可以使用 res.send(foo) 两次吗?

转载 作者:行者123 更新时间:2023-12-01 00:24:34 25 4
gpt4 key购买 nike

我想将我的 token 和用户 Angular 色发送到我的login.component.ts。

当我试图找到问题时,在我的研究中我遇到了某人的建议来使用

res.write(foo1)
res.write(foo2)
res.end

而不是

res.send(foo1)
res.send(foo2)

但这没有用。然后我尝试用它来测试它:

res.write(foo1)
res.end()

但这给了我一个错误:

events.js:174

throw er; // Unhandled 'error' event
^

TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be one of type string or Buffer. Received type object
at write_ (_http_outgoing.js:595:11)
at ServerResponse.write (_http_outgoing.js:567:10)
at User.findOne (C:\Users\notan\GitHub\se3316-notansandwich-lab5\server\controllers\user.controller.js:46:33)
at C:\Users\notan\node_modules\mongoose\lib\model.js:4604:16
at C:\Users\notan\node_modules\mongoose\lib\query.js:4348:12
at process.nextTick (C:\Users\notan\node_modules\mongoose\lib\query.js:2850:28)
at process._tickCallback (internal/process/next_tick.js:61:11)
Emitted 'error' event at:
at C:\Users\notan\node_modules\mongoose\lib\model.js:4606:13
at C:\Users\notan\node_modules\mongoose\lib\query.js:4348:12
at process.nextTick (C:\Users\notan\node_modules\mongoose\lib\query.js:2850:28)
at process._tickCallback (internal/process/next_tick.js:61:11)

这是我的user.controller.js,我在我的route.js中使用它,而我的route.js又在我的sever.js中使用

const User = require('../models/user.model')
const jwt = require('jsonwebtoken')

exports.user_create = function (req, res, next) {
let user = new User(
{
_id: Math.random().toString(36).substr(2, 5), // generate a random ID
email: req.body.email,
password: req.body.password,
firstName: req.body.firstName,
lastName: req.body.lastName,
role: "user"
}
);

user.save(function (err, registeredUser) {
if (err) {
return next(err);
}
else {
let payload = { subject: registeredUser._id}
let token = jwt.sign(payload, 'secretKey')
res.status(200).send({token})
}

})
}

exports.user_login = function (req, res, next) {
let userData = req.body
User.findOne({email: userData.email}, (err, user) => {
if (err) {
console.log(err)
}
else {
if (!user) {
res.status(401).send('Invalid email')
}
else if (user.password !== userData.password) {
res.status(401).send('Invalid password')
}
else {
let payload = {subject: user._id}
let token = jwt.sign(payload, 'secretKey')
//res.status(200).send({token})
res.status(200).write({token})
//let role = this.user.role
// res.status(200).write({role})
res.end()
}
}
})
}

使用这个作品

res.status(200).send({token})

但这并不

res.status(200).write({token})
res.end()

最佳答案

回答您的问题标题:

Can I use res.send(foo) twice?

不,您不能对同一个请求调用两次。

查看答案的第二部分,因为在我写完第一部分后OP改变了他们的问题

在 Express 中,每次只能使用一次 res.send()res.json()res.end()要求。当您执行这些操作时,它会发送请求。如果您尝试针对同一请求发送更多内容,它将不会执行任何操作,并且会在 Express 中显示警告。

res.write() 可以多次调用,然后在最终完成请求时调用 res.end()

在您的示例中:

res.status(200).send({token})
res.end()

res.send() 已为您调用 .end(),因此尝试再次调用它会被视为错误,因为请求已发送。

<小时/>

仅供引用,.status(200) 不是必需的。默认状态已经是 200,因此 res.send({token}) 将已经具有 200 状态。

<小时/>

修改后的问题的最新答案

现在您已将问题完全更改为有关 res.write({token}),这不起作用,因为 res.write() 需要StringBuffer 作为参数,并且您给它一个对象。您必须自己手动将对象转换为 JSON:

res.type('application/json');
res.write(JSON.stringify({token}));
res.end();

请注意,这还会设置适当的内容类型。如果您的对象使用 res.write() 很大,您可能还需要注意写入缓冲区已满并监听 drain 事件。 res.write() 是一个比用于发送数据的 Express 函数低得多的级别的工具(它位于 http 级别,而不是 Express 级别)。

内置于 Express 中,您可以使用 res.send()res.json(),它们是 Express 方法,它们会在您传递对象时自动转换为您将其设置为 JSON,并将内容类型也设置为 JSON。它还将处理写入流中的任何缓冲区已满问题。

res.send({token});

或者,我更喜欢在我的 Express 代码中更加明确:

res.json({token});

而且,如果您尝试发送多条数据,可以将它们放入同一个对象中:

res.json({token, role});

关于javascript - 我可以使用 res.send(foo) 两次吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59130505/

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