nodejs выражают, как отправить ответ обратно в браузер - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь создать приложение для входа в nodejs, используя angularjs и express.Из angularjs я отправляю $ http почтовый запрос на сервер, где сначала он должен проверить, присутствуют ли данные в MongoDB, и отправить ответ обратно клиенту.

Проблема в том, что я не могу настроить ответ с информацией заголовка.Каждый раз, когда я получаю

Ошибка: невозможно установить заголовки после их отправки.

или

MongoError: E11000 дубликат ключаколлекция ошибок

Here is my app.js code.

app.post('/signin',function (req,res) {
    console.log('i recievied a get request in app.js = /signin');   
    console.log(req.body);
    db.users.findOne({$or: [{username: req.body.username}, {email: req.body.email}]},function (err, data){
    if ( err ) throw err;
    if (err) { res.send(err); return; }
    //res.json({ data: "Invalid Password" });
    if ( err ) {console.log('user found already in db'); console.log(err)};
    //res.json(data);
    //console.log('user found already in db')
    //res.redirect('/foo/bar');
    res.end('user found already in db');
    //res.send({ data: 'user found already in db' })
    //res.setHeader('Content-Type', 'application/json');
    //res.json({ a: 1 });   
    //res.writeHead(200, {'Content-Type': 'text/plain'});
    //res.send("jai shree ram");
    //res.end();
    //return;
    });

    db['users'].insert({
        username : req.body.username,
        firstname : req.body.firstname,
        lastname : req.body.lastname,
        email : req.body.email,
        password : req.body.password,
        createdAt : new Date(),
        role : "user",
        approvedBy : req.body.approver.username,
        status : "locked"
    },function (err, data){
    if ( err ) throw err;   
    //if ( err ) {console.log('user created in db'); console.log(err)}; 
    //res.json(data);
    //if (err) { res.send(err); return; }
    //res.json({ data: "Password" });
    res.end('user created in db');
    //res.send({ data: 'user created in db' })
    //res.setHeader('Content-Type', 'application/json');
    //res.json({ a: 1 });
    //res.end();
    //return;
    })

}); 

А из браузера я размещаю ниже запрос

$http({
            url: '/signin',
            method: "POST",
            data: $scope.SignInForm
            //headers: {'Content-Type': 'myapplication/json','charset' : 'utf-8'}
            })
            .then(function (res){
                console.log(res.data)                       
                },function (error){
                console.log(error)
            });

Я испытал много вещей, но не смог добиться успеха.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Поскольку node js работает asynchrounously ваш insert не будет ждать завершения findOne, поэтому вы получаете duplicate error

Вам необходимо insert данные в обратном вызове функция из findOne

app.post('/signin', function (req, res) {
    console.log('i recievied a get request in app.js = /signin');
    console.log(req.body);
    db.users.findOne({ $or: [{ username: req.body.username }, { email: req.body.email }] }, function (err, data) {
        if (data) {
            res.setHeader('Content-Type', 'application/json');
            res.end({ data: 'user found already in db' })
        }
        else {
            db['users'].insert({
                username: req.body.username,
                firstname: req.body.firstname,
                lastname: req.body.lastname,
                email: req.body.email,
                password: req.body.password,
                createdAt: new Date(),
                role: "user",
                approvedBy: req.body.approver.username,
                status: "locked"
            }, function (err, data) {
                if (err) {
                    res.setHeader('Content-Type', 'application/json');
                    res.end({ data: err })
                }
                res.setHeader('Content-Type', 'application/json');
                res.send({ data: 'user created in db' })

            })
        }
    });

}); 
0 голосов
/ 26 мая 2018

Порядок установки заголовков и отправки данных неправильный.Сначала установите заголовки, а затем отправьте ответ внешнему интерфейсу.

res.setHeader('Content-Type', 'application/json');
res.send({ data: 'user created in db' })

Во-вторых, вставка и поиск выполняются параллельно.Вставка должна работать, только если пользователь не найден в db

app.post('/signin',function (req,res) {
    console.log('i recievied a get request in app.js = /signin');   
    console.log(req.body);
    db.users.findOne({$or: [{username: req.body.username}, {email: req.body.email}]},function (err, data){
        if (err) { 
            //Error Case (send to front end)
            res.send( error) 
        } else {
            if(data == null) {//Condition to check whether data exists or not
                db['users'].insert({
                    username : req.body.username,
                    firstname : req.body.firstname,
                    lastname : req.body.lastname,
                    email : req.body.email,
                    password : req.body.password,
                    createdAt : new Date(),
                    role : "user",
                    approvedBy : req.body.approver.username,
                    status : "locked"
                },function (err, data){
                    if ( err ) throw err;   
                    res.setHeader('Content-Type', 'application/json');
                    res.send({ data: 'user created in db' })
                });
            } else {
                 res.send(data)
            }
        }
    })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...