0

初めて Express を使用していますが、問題が発生しています。このチュートリアルを自分の目的のために変更しようとしていますが、MongoDB の代わりに Redis を使用しています。

これが私のコードです:

redisSource.js:

var redis = require ("node-redis");

RedisSource = function () {
        this.r_client = redis.createClient();

        this.getParents = function (circuit_id, cb) {
                this.r_client.smembers('circuit.parents_of:' + circuit_id, function(err, reply){
                        console.log("Reply: " + reply);
                        cb(err, reply);
                });
        }
}

exports.RedisSource = RedisSource;

フェッチ.js:

Fetch = function(app) {
        var RedisSource = require ('./redisSource').RedisSource;
        var redisSource = new RedisSource();

        app.get('/parents/:id', function(req, res) {
                redisSource.getParents(req.params.id, function (error, parents) {
                        console.log ("Response in Fetch main: " + parents);
                        res.send(parents);
                });
        });

        app.get('/test', function (req, res) {
                res.send('Hello, world!');
        });
};

exports.Fetch = Fetch;

app.js:

/**
 * Module dependencies.
 */

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);

var Fetch = require('./fetch').Fetch;
var FetchService = new Fetch(app);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

アプリケーションを実行すると、次のようになります。

GET http://ironsides.zayo.com:3000/test
> Hello, world!

これは私が期待するものです。しかし、他の呼び出しを試みると:

GET http://ironsides.zayo.com:3000/parents/12115
> [ [ 49, 53, 50, 55, 51 ], [ 49, 53, 50, 56, 56 ], [ 49, 53, 51, 48, 56 ], [ 49, 53, 51, 48, 57 ], [ 49, 53, 51, 49, 48 ], [ 49, 53, 51, 49, 49 ], [ 49, 53, 51, 50, 56 ], [ 49, 53, 51, 50, 57 ], [ 49, 53, 51, 51, 48 ], [ 49, 53, 51, 52, 49 ], [ 51, 51, 50, 54, 51 ] ]

コンソールでは、次のようになります。

GET /parents/12115 200 74ms - 530b
Reply: 15273,15288,15308,15309,15310,15311,15328,15329,15330,15341,33263
Response in Fetch main: 15273,15288,15308,15309,15310,15311,15328,15329,15330,15341,33263

コンソールに表示される整数の配列を期待しています。代わりに、これらの整数の ASCII 文字コードの配列の配列を取得しています。私は本当に混乱しています。私は単純なものが欠けていると確信しています。

4

2 に答える 2

0

どうですか:

res.send(parents.toString());
于 2013-09-13T01:54:04.793 に答える
0

max のコメントとこのスレッドの間で、私はそれを理解しました。「node-redis」モジュールは、文字列ではなくバッファを返します。ステートメントを書き直すと:

console.log ("Response in Fetch main: " + parents);

なので

console.log (parents);

その後、バッファの配列として返されます。そこで、 redisSource.getParents() を次のように書き直しました。

    this.getParents = function (circuit_id, cb) {
            this.r_client.smembers('circuit.parents_of:' + circuit_id, function(err, reply){
                    console.log("Reply: " + reply);
                    var string_reply = reply.map(function(item) { return item.toString('utf8'); });
                    cb(err, string_reply);
            });
    }

ご覧のとおり、これはバッファの配列ではなく文字列の配列を返します。

于 2013-09-13T14:49:23.743 に答える