2

これに関連するいくつかの投稿を見てきましたが、ここで問題になるものはないようです。

これは、windows7にexpressjsを搭載した非常にシンプルな初心者のnodejsアプリです。

/**
 * Module dependencies.
 */


var express = require('express')
    , connect = require('connect')
    , http = require('http')


var app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  // app.use(express.bodyParser());
  app.use(connect.bodyParser());
});

/**
 * Routes
 */
//get requests
// app.get("/", function(req, res){
//   res.send("Hello, Express!");
// });

// app.get("/hi", function(req, res){
//   var message = [
//     "<h1>Hello, Express!</h1>",
//     "<p>Welcome to 'Building Web Apps in Node.js with Express.'</p>",
//     "<p>You'll love Express because it's</p>",
//     "<ul><li>Fast</li>",
//     "<li>Fun</li>",
//     "<li>Flexible</li>"
//   ].join("\n");

//   res.send(message);
// });

// app.get("/users/:userID", function(req, res){
//   res.send("<h1>Hello, User #" + req.params.userID + "!");
// });

//post requests
app.post("/users", function(req, res){
    // res.send(req.body);
    res.send(req.body.username);
});


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

ご覧のとおり、問題が発生していないことを確認するために他のルートをコメントアウトしました。また、「connect」をインストールして使用してみましたが、express.bodyParser()とconnect.bodyParser()の両方で同じ結果が得られます。結果。

chrome adv restクライアント拡張機能を使用し、次の単純なphpフォームも試しました。

<form action="http://localhost:3000/users" method="POST" enctype="application/x-www-form-urlencoded">
    <li>
        <label for="username">Username</label>
        <input type="text" name="username" id="username">
    </li>
    <li>
        <input type="submit" name="submit" id="submit">
    </li>
</form>

すべての場合で、空または未定義のreq.body.usernameを取得し、応答でreq.bodyだけを試行すると、空のオブジェクト{}を取得します。

更新: Chromeからの応答/リクエストヘッダー情報は次のとおりです。

Request URL:http://localhost:3000/users
Request Method:POST
Status Code:200 OK
Request Headersview source
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:31
Host:localhost:3000
Request Payload
username=isimmons&submit=Submit
Response Headersview source
Connection:keep-alive
Date:Sat, 27 Oct 2012 23:01:45 GMT
Transfer-Encoding:chunked
X-Powered-By:Express

そして、これがreq.routeを送信したときに得られるものです

//result of console.log(req.route);
{ path: '/users',
  method: 'post',
  callbacks: [ [Function] ],
  keys: [],
  regexp: /^\/users\/?$/i,
  params: [] }

ノードおよびエクスプレスバージョン:エクスプレス3.0ノード0.8.9

UPDATE2問題の半解決 以下のコメントを参照してください。ここで言っておくべきだった。とにかく、これが正しく機能するときのchromeからのリクエストヘッダー情報です。

Request URL:http://localhost:3000/users
Request Method:POST
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:26
Content-Type:application/x-www-form-urlencoded
Host:localhost:3000
Origin:http://localhost
Referer:http://localhost/nodeform.php
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.16 (KHTML, like Gecko) Chrome/24.0.1305.3 Safari/537.16
Form Dataview sourceview URL encoded
username:dfd
submit:Submit
Response Headersview source
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
Date:Sun, 28 Oct 2012 01:12:23 GMT
X-Powered-By:Express

ありがとう

4

1 に答える 1

1

さて、最終的に残りのAPIのこのバグレポートに出くわし、コンテンツタイプを追加するだけで問題が解決しました。

バグレポート

バグレポートには、送信する前に「Content-type」ヘッダーを手動で追加するという返信があります。これが、phpフォームが機能した理由です。enctypeが設定されているので、上記のように完全なリクエストヘッダーを取得します。

手動で追加する正しいコンテンツタイプヘッダーは次のとおりです。

Content-Type: application/x-www-form-urlencoded
于 2012-10-28T02:31:13.683 に答える