2

JSON パケットを Web サーバーに送信する iOS アプリがあります。ウェブサーバーのコードは次のようになります。

var express = require('express');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var app = express();
mongoose.connect('mongodb://localhost/test');

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function (callback) {
  console.log("MongoDB connection is open.");
});

// Mongoose Schema definition
var Schema = mongoose.Schema;
var LocationSchema = new Schema({
    X: Number,
    Y: Number,
    Orientation: Number,
    UserID: String,
    Time: String
});

// Mongoose Model definition
var LocationsCollection = mongoose.model('locations', LocationSchema);

// create application/json parser
var jsonParser = bodyParser.json();

// URL management
app.get('/', function (req, res) {
    res.sendFile(__dirname + '/index.html');
});

app.post('/update', jsonParser, function (req, res) {
    if (!req.body) return res.sendStatus(400);
    else {
        console.log(req.body);
    }
});

// Start the server
var server = app.listen(3000, function () {
  var host = server.address().address
  var port = server.address().port
  console.log('App listening at %s:%s',host, port)
});

重要な部分は、iOS アプリから送信された着信 http 要求を処理する app.post メソッドです。現時点では、req.body をコンソールに出力するメソッドは次のようになります。

{ 
  datapoint_1:
   { timestamp: '2015-02-06T13:02:40:361Z',
     x: 0.6164286615466197,
     y: -0.6234909703424794,
     id: 'B296DF8B-6489-420A-97B4-6F0F48052758',
     orientation: 271.3345946652066 },
  datapoint_2:
   { timestamp: '2015-02-06T13:02:40:961Z',
     x: 0.6164286615466197,
     y: -0.6234909703424794,
     id: 'B296DF8B-6489-420A-97B4-6F0F48052758',
     orientation: 273.6719055175781 }
}

したがって、リクエストがネストされた JSON オブジェクトであることがわかります。理想的には、リクエスト オブジェクト (つまり、データポイント) をループして、それらを mongoDB データベースに (mongoose 経由で) 挿入したいと思います。ただし、req.body を使用して多くのことを行う方法がわかりません。リクエストを反復するためのループを作成したり、ネストされた JSON ファイルを適切に解析してマングース スキーマと一致させたりする方法を作成できないようです。これらのデータポイントをマングースデータベースに挿入する方法について、誰かがガイダンスを提供できますか?

4

4 に答える 4

11

body-parser の extendedプロパティをに設定しtrueて、ネストされたオブジェクトを解析できるようにします。

var express = require('express');
var app = express()
var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({
    extended: true
}));
于 2015-03-03T15:17:08.377 に答える
1

このようなことを試してください。

var app = express();
var bodyParser   = require('body-parser');
app.use(bodyParser.json({limit:1024*1024, verify: function(req, res, buf){
    try {
        JSON.parse(buf);
    } catch(e) {
        res.send({
            error: 'BROKEN_JSON'
        });
    }
}}));
于 2015-02-06T19:05:32.267 に答える
1

それは単純なfor (var key in obj)ループでなければなりません:

app.post('/update', jsonParser, function (req, res) {

    var locationObject = req.body(),
        insertObjects = [],
        key;

    for (key in locationObject) { // loop through each object and insert them into our array of object to insert.
        insertObjects.push(locationObject[key]); 
    }
    if (!insertObjects.length) { // if we don't have any object to insert we still return a 200, we just don't insert anything.
        return res.status(200).send({
            success: true,
            message: 'Nothing inserted, 0 locations in POST body',
            count: 0;
        });
    }
    LocationsCollection.create(insertObjects, function (err, res) {
        if (err) {
            return res.status(400).send({
                success: false,
                message: err.message
            });
        }
        // we have successfully inserted our objects. let's tell the client.
        res.status(200).send({ 
            success: true,
            message: 'successfully inserted locations',
            count: insertObjects.length;
        });
    });
});

Mongo では、1 回のコールバックで複数のドキュメントを挿入できるため、これが非常に簡単になります。

また、スキーマをチェックして、適切なドキュメントのみが作成されるようにします。

于 2015-02-06T22:34:53.887 に答える