【问题标题】:Identifier … has already been declared标识符……已经被声明
【发布时间】:2019-10-10 02:14:46
【问题描述】:

我正在建立一个社交网络来学习 nodejs 和 reactjs。目前,在使用邮递员在/signin 调试中构建后端时,我什至无法启动节点服务器,cmd 抛出以下错误:

\node_react\2\nodeapi\controllers\auth.js:40
const {_id, name, email} = user;
          ^
SyntaxError: Identifier 'email' has already been declared    

引发错误的代码sn-p如下:

//generate a token with user id and secret
const token = jwt.sign({_id: user._id}, process.env.JWT_SECRET);

//persist the token as 't' in cookie with expiry date
res.cookie("t", token, {expire: new Date() + 9999});

//return response with user and token to frontend client
const {_id, name, email} = user;
return res.json({token, user:{_id, email, name}});

完整的auth.js代码如下:

const jwt = require("jsonwebtoken");
require ('dotenv').config();
const User = require("../models/user");

exports.signup = async (req, res) => {
    const userExists = await User.findOne({email: req.body.email});
    if(userExists) 
        return res.status(403).json({
            error: "Email is taken!"
        }); 
    const user = await new User(req.body);
    await user.save();
    res.status(200).json({ message: "Signup success! Please login:)" });
};

exports.signin = (req,res) => {
    //find the user based on email
    const { email, password } = req.body 
    User.findOne({email}, (err, user) => {
        //if error or no user
        if (err || !user) {
            return res.status(401).json({
                error: "User with that email does not exists. Please signin."
            });
        }
        //if user is found make sure the email and password match
        // create authenticate method in model and use here
        if (!user.authenticate(password))
            return res.status(401).json({
                error: "Email and password do not match."
            });
    })

    //generate a token with user id and secret
    const token = jwt.sign({_id: user._id}, process.env.JWT_SECRET);

    //persist the token as 't' in cookie with expiry date
    res.cookie("t", token, {expire: new Date() + "9999"});
    //return response with user and token to frontend client
    const {_id, name, email} = user;
    return res.json({token, user:{_id, email, name}});      
}

【问题讨论】:

  • 您似乎在此分配之前定义了email。你能提供所有的auth.ts代码吗?
  • 不相关但new Date() + 9999 将是字符串连接而不是算术。
  • 添加了 auth.js 代码@GustavoLopes
  • 在我的情况下,我正在导出我导入的东西......同名......只需为此执行export { curry as curry }。逻辑是外部依赖可以在不需要重构的情况下进行全局扩展、交换和集中替换。具体错误:SyntaxError: Identifier 'curry' has already been declared

标签: node.js typescript express postman


【解决方案1】:

const {_id, name, email} = user; 被称为解构,它会分配与其对象名称相同的新变量。

所以这个:

const {_id, name, email} = user;

等同于:

const _id = user._id;
const name = user.name;
const email = user.email;

也就是说,您可能正在重新定义 email 变量,该变量是使用 const 关键字设置的。这意味着你不能重新分配它。

你可以做的是:

const {_id, name, email: _email} = user;
return res.json({token, user:{_id, name, email: _email}});

这将使email 字段分配给_email 变量,避免冲突。

【讨论】:

  • 谢谢@Jeena,这解决了这个问题,现在节点服务器已经启动,但是在使用邮递员进行登录调试时,cmd 给了我以下信息: ReferenceError: user is not defined at exports.signin ( C:\Users\luisc\node_react\2\nodeapi\controllers\auth.js:35:38) 在 Layer.handle [as handle_request] (C:\Users\luisc\node_react\2\nodeapi\node_modules\express\lib \router\layer.js:95 :5)
  • 请看我的回答。
【解决方案2】:

在您的代码中,您将覆盖 email 变量,该变量是使用 const 关键字创建的(又名:无法重新分配)。

Jeena 的回答可能解决了问题,但似乎你有更深层次的问题。

User.findOne({email}, (err, user){} 是异步的。所以这段代码下面的代码很可能会失败。

您可能必须将代码重写为:

exports.signin = (req,res) => {
    //find the user based on email
    const { email, password } = req.body 
    User.findOne({email}, (err, user) => {
        //if error or no user
        if (err || !user) {
            return res.status(401).json({
                error: "User with that email does not exists. Please signin."
            });
        }
        //if user is found make sure the email and password match
        // create authenticate method in model and use here
        if (!user.authenticate(password))
            return res.status(401).json({
                error: "Email and password do not match."
            });

        //generate a token with user id and secret
        const token = jwt.sign({_id: user._id}, process.env.JWT_SECRET);

        //persist the token as 't' in cookie with expiry date
        res.cookie("t", token, {expire: new Date() + "9999"});
        //return response with user and token to frontend client
        const {_id, name, email} = user;
        return res.json({token, user:{_id, email, name}});      
    })
}

cookiesresponse 必须在 MongoDB 查询中,因此您确实拥有该用户。

【讨论】:

  • 非常感谢/Muito Obrigado @GustavoLopes,这完全解决了问题
  • 不客气。作为最佳实践,请尝试始终将括号括在 if/while 语句周围。它有助于避免混淆身份。
猜你喜欢
  • 2020-02-13
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2021-03-28
相关资源
最近更新 更多