Как сделать POST для node.js из апплета? - PullRequest
1 голос
/ 18 марта 2012

У меня есть апплет (не наш выбор, это движок MarioAI), который я хотел бы подключить к приложению node.js, использующему Express ... но я не могу заставить mongodb принимать значения, которые я отправляю в моем POST запрос через localhost. Я продолжаю получать 200 ответов от узла, но «неопределенный» от mongooose, что, как я подозреваю, означает, что URLEncoder, который я использую в Java, искажает строку, через которую я посылаю каким-то образом.

Я прочитал это:

Проблема с Java-апплетом для подключения нашего сервера для вызова файла PHP

и попробовал следующий вызов OutputStreamWriter в Java:

//EvaluateFrustration() takes an int but should come back with a float value
String frustrationString = Double.toString(EvaluateFrustration(this.periods));
try {
    URL url = new URL("http://127.0.0.1:8888/mario");               
    final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    System.out.println(conn.getResponseCode());
    conn.setUseCaches (false);
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

    OutputStreamWriter writer;


    writer = AccessController
                .doPrivileged(new PrivilegedExceptionAction<OutputStreamWriter>() {
                    public OutputStreamWriter run() throws IOException {
                        return new OutputStreamWriter(conn.getOutputStream());
                    }
                });
        String data = URLEncoder.encode("frustrationValueFirstRound=" 
                + frustrationString,"UTF-8");
        writer.write(data);
        writer.flush();

} catch (Exception e) {
}

В приложении узла (используя Express и mongoose / mongodb) я написал:

var express = require('express');

var mongoose = require('mongoose');

var Schema = mongoose.Schema
  , ObjectId = Schema.ObjectId;

var ExperimentSchema = new Schema({
    experiment    : ObjectId
    , frustrationValueFirstRound : Number
});

mongoose.connect('mongodb://localhost/mariopaper');
mongoose.model('Experiment', ExperimentSchema);
var Experiment = mongoose.model('Experiment');

app.post('/mario', function(req, res){
  var exp = new Experiment();
  exp.frustrationValueFirstRound = req.body.frustrationValueFirstRound;
  exp.save(function(err){   if (err) { throw err; }
  res.send('ok');
});

Для справки, я хотел бы отметить, что этот вызов curl работает просто отлично:

curl -d "frustrationValueFirstRound=99" http://localhost:8888/mario

У кого-нибудь есть идеи, просто написал ли я POST неправильно в Java, или, возможно, я что-то упускаю из-за того, как работает URLEncoder.encode ()?

1 Ответ

0 голосов
/ 26 июля 2017

Я думаю, это потому, что у вас нет модуля узла body-parser, который «анализирует входящие тела запросов в промежуточном программном обеспечении до ваших обработчиков, доступных в свойстве req.body».

Попробуйте это (после установки модуля body-parser):

var express = require('express');

var mongoose = require('mongoose');

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

app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));

var Schema = mongoose.Schema
  , ObjectId = Schema.ObjectId;

var ExperimentSchema = new Schema({
    experiment    : ObjectId
    , frustrationValueFirstRound : Number
});

mongoose.connect('mongodb://localhost/mariopaper');
mongoose.model('Experiment', ExperimentSchema);
var Experiment = mongoose.model('Experiment');

app.post('/mario', function(req, res){
  console.log(req.body); // Is there something here ?
  var exp = new Experiment();
  exp.frustrationValueFirstRound = req.body.frustrationValueFirstRound;
  exp.save(function(err){   if (err) { throw err; }
  res.send('ok');
});

источник: https://github.com/expressjs/body-parser

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...