0

メッセージとその他の結果を返す外部サービスにデータを投稿する単純なモジュールを作成しました。

これを Mocha でテストしようとしていますが、戻り値にアクセスする方法を理解するのが難しいと感じています。

コンソールに記録されているのを見ることができますが、変数として設定する方法がわかりません。お気づきかもしれませんが、私は初心者の javacripter です。私はそれが簡単だと確信しています、私は方法を見ることができません。

私のモジュール:

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"}
4

1 に答える 1

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

定義する関数が同じスコープにある場合、foo のスコープ内で someCallBackFunction に直接アクセスすることもできますが、コールバックを渡す方がスタイルが優れています。

于 2013-06-25T16:15:10.277 に答える