Получение возвращаемого значения из модуля JS/Node

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

Я пытаюсь проверить это с помощью Mocha, но мне трудно понять, как получить доступ к возвращаемому значению.

Я вижу, что он зарегистрирован в консоли, но не знает, как установить его как переменную. Как вы не сомневаетесь в заметке, я начинающий джавакриптер. Я уверен, что это просто, я просто не понимаю, как это сделать.

Мой модуль:

module.exports = {

 foo: function(id,serial) {
 var querystring = require('querystring');
 var http = require('http');
 var fs = require('fs');
 var post_data = querystring.stringify({
 'serial' : serial,
 'id': id
 });

 var post_options = {
 host: 'localhost',
 port: '8080',
 path: '/api/v1/status',
 method: 'POST',
 headers: {
 'Content-Type': 'application/x-www-form-urlencoded',
 'Content-Length': post_data.length
 }
 };

 var post_req = http.request(post_options, function(res) {
 res.setEncoding('utf8');
 res.on('data', function (chunk) {
 console.log(chunk);
 return chunk;
 });
 });

 post_req.write(post_data);
 post_req.end();
 }
}

И я назвал это следующим:

describe('Functions and modules', function() {
 it('does some shizzle', function(done) {
 var tools = require('../tools');
 chunk = '';
 id = 123;
 serial =456;
 tools.foo(id,serial);
 chunk.should.equal.......
 });
});

Мне в основном нужно возвращенное сообщение от tools.foo(id, serial). Однако кусок пуст, чем пустая вещь.

В моем терминале я вижу что-то вроде:

{"message":"This device is still in use","live":"nop"}
1 ответ

Вы не можете получить доступ к "возвращенному" значению так, как на других языках. Запросы Http в узле являются асинхронными и не возвращают их значения. Вместо этого вы передаете функцию обратного вызова или создаете функцию обратного вызова в рамках одного и того же запроса. Например, вы можете выполнить свою функцию следующим образом: (я удалил часть наполнителя)

module.exports = {

 foo: function (options, data, callback) {
 'use strict';

 var completeData = '';

 var post_req = http.request(options, function (res) {
 res.setEncoding('utf8');

 res.on('data', function (chunk) {
 console.log(chunk);
 completeData += chunk;
 return chunk;
 });

 res.on('end', function () {
 callback(completeData);
 //You can't return the data, but you can pass foo a callback,
 //and call that function with the data you collected
 //as the argument.
 });

 });

 post_req.write(data);
 post_req.end();
 }
};

function someCallBackFunction (data) {
 console.log("THE DATA: " + data);
}

var someOptions = "whatever your options are";
var someData = "whatever your data is";

module.exports.foo(someOptions, someData, someCallBackFunction);

Если функция, которую вы определяете, находится в одной области, вы также можете получить доступ к someCallBackFunction непосредственно в области foo, но передача в обратном вызове - это лучший стиль.

licensed under cc by-sa 3.0 with attribution.