Идентификатор… уже объявлен - PullRequest
1 голос
/ 23 мая 2019

Я строю социальную сеть, чтобы изучать nodejs и реагировать. В настоящее время при создании серверной части в отладке /signin с почтальоном, я даже не могу запустить сервер узла, cmd выдает следующую ошибку:

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

Фрагмент кода, который выдает ошибку, следующий:

//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}});      
}

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

В вашем коде вы переопределяете переменную email, которая была создана с помощью ключевого слова const (иначе: невозможно переназначить).

Ответ Джины, вероятно, решает проблему, нокажется, у вас есть более глубокая проблема.

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}});      
    })
}

cookies и response должны быть внутри запроса MongoDB, поэтомуу вас есть пользователь.

2 голосов
/ 23 мая 2019

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, что исключит конфликт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...