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

标签 javascript node.js express

我想将我的 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/

相关文章:

javascript - Firefox 上的自定义滚动条

具有多个构造函数的 Java 改造类与多个类

node.js - 参数错误,node.js 中的 options.body?

node.js - IBM Watson Speech to Text Websocket 关闭(代码 1000)无结果

node.js - 服务器到服务器通信的 SSL 证书替代方案

node.js - put 在express js 中不起作用

javascript - "document.write"的字体属性不起作用

在 jsfiddle 上找不到 JavaScript 函数

Javascript从具有最小值的数组中获取对象,需要找到最小值然后找到对象

javascript - 使用 mongodb 聚合如何减去持续时间