2014-09-21 3 views
0

У меня есть эта функция nodejs, которая предназначена для вставки некоторых данных в db, а когда она заканчивается, она должна возвращать «успех» или «отказ».Функция nodejs не возвращает значение

Эта функция находится в файле insert.js

function insert (req,res) { 
    var d = req.body; 

    new dbModel({ 
     name: d.dname, 
     desc: d.desc 
     }).save(false,function(err){ 
      if (err){ 
       return 'failure'; 
      }else{ 
       return 'success'; 
      } 
     }); 
} 

module.exports.insert = insert; 

Он вставляет данные в БД, но он не возвращает никакого значения.

Это маршрут, который вызывает указанную выше функцию, и это находится в файле routes.js.

router.post('/insert', function(req, res) { 
    var result = insert.insert(req,res); 
    res.render('insert',{title: 'insert',message: result}); 
}); 

Могу ли я делать что-нибудь не так или это что-то делать с асинхронным характером nodejs.

Пожалуйста, помогите. Благодарю.

EDIT Я попытался как сказал @Salehen Rahman в ответах ниже, но страница не делает и браузер продолжает ожидать ответа от сервера и я пытался войти значение результата внутри обратного вызова и снова нет вывода, кажется, что код внутри функции обратного вызова не запущен. Я проверил db, и данные были вставлены успешно.

+8

Добро пожаловать в чудесный мир ** async **! Вы не можете этого сделать. – SLaks

+1

Используйте обратный вызов для вашего метода 'insert' и передайте' result' этому параметру – Bergi

ответ

1

Это dbModel#save метод является асинхронным, а значит, return ключевого слова будет возвращать только квнутреннимanonymous function. Вместо этого вы хотите использовать обратные вызовы. Также удалите false из метода save. Он может иметь только функцию обратного вызова в качестве параметра.

Итак, ваша insert функция будет выглядеть следующим образом:

function insert (req, res, callback) { 
    var d = req.body; 

    new dbModel({ 
     name: d.dname, 
     desc: d.desc 
     }).save(function(err){ 
      if (err){ 
       // Instead of return, you call the callback 
       callback(null, 'failure'); 
      }else{ 
       // Instead of return, you call the callback 
       callback(null, 'success'); 
      } 
     }); 
} 

module.exports.insert = insert; 

И ваша функция путь будет выглядеть следующим образом:

router.post('/insert', function(req, res) { 
    insert.insert(req, res, function (err, result) { 
     res.render('insert',{title: 'insert', message: result}); 
    }); 
}); 

В идеале, хотя всякий раз, когда внутренний обратный вызов возвращает ошибку, должен также вызвать ваш обратный вызов с ошибкой без каких-либо результатов; отсутствует ошибка, и при наличии успешного вызова функции вы устанавливаете первый параметр равным null, а второй - вашему результату.

Как правило, первый параметр вызова обратного вызова представляет собой ошибку, где, когда второй параметр представляет ваш результат.

В качестве справочного материала вы можете прочитать на Node.js' callback pattern.

+0

спасибо за ответ. Я пробовал это, страница не рендеринга, браузер продолжает ждать ответа с сервера, и я попытался записать значение результата и снова не выводить, кажется, что код внутри функции обратного вызова не запущен. –

+0

Где вы звонили в console.log? Изнутри анонимной функции в маршрутизаторе? –

+0

Да, я помещаю этот console.log внутри анонимной функции в маршрутизаторе. –

Смежные вопросы