2015-06-20 41 views
0

我想用jsonschema来验证我的json。这是我的server.js代码:如何在node.js服务中调用POST方法?

// set up ====================================================================== 
var express = require('express'); 
var app  = express();        // create our app w/ express 
var port  = process.env.PORT || 8080;    // set the port 
var bodyParser = require('body-parser'); 
var methodOverride = require('method-override') 

app.use(function(req, res, next) { 
    //the code hits this point! 
    var data = ''; 
    req.on('data', function(chunk) { 
     data += chunk; 
    }); 
    req.on('end', function() { 
     req.rawBody = data; 

    }); 
    console.log(data); 
    next(); 
}); 
app.use(bodyParser.json()); 
app.use(methodOverride()); 

// routes ====================================================================== 
require('./routes.js')(app); 

// listen (start app with node server.js) ====================================== 
app.listen(port); 
console.log("App listening on port " + port); 

的routes.js看起来是这样的:

module.exports = function (app) { 
    app.post('/api/postding', function (req, res) { 
      //do some schema validation 
     var test=1; 
    }) 
} 

当我发布无效JSON现在我得到这个错误:

SyntaxError: Unexpected token t 
<br> &nbsp; &nbsp;at Object.parse (native) 
    <br> &nbsp; &nbsp;at parse (c:\nodestuff\trystuff\node_modules\body-parser\lib\types\json.js:88:17) 
     <br> &nbsp; &nbsp;at c:\nodestuff\trystuff\node_modules\body-parser\lib\read.js:108:18 
      <br> &nbsp; &nbsp;at done (c:\nodestuff\trystuff\node_modules\body-parser\node_modules\raw-body\index.js:233:14) 
       <br> &nbsp; &nbsp;at IncomingMessage.onEnd (c:\nodestuff\trystuff\node_modules\body-parser\node_modules\raw-body\index.js:279:7) 
        <br> &nbsp; &nbsp;at IncomingMessage.g (events.js:180:16) 
         <br> &nbsp; &nbsp;at IncomingMessage.emit (events.js:117:20) 
          <br> &nbsp; &nbsp;at _stream_readable.js:943:16 
           <br> &nbsp; &nbsp;at process._tickCallback (node.js:419:13) 

问题我真的该如何为我的postrequest执行jsonschema验证?

+0

尝试移动'app.use(bodyParser.js on());'var methodoverride ...'下面的正下方' –

+0

为什么你在读取整个原始请求而不是让'bodyParser.json()'处理请求数据? – mscdex

+0

我想收到原始的请求,所以我可以在我的post方法中执行jsonschema验证 – Pindakaas

回答

1

server.js

// set up ====================================================================== 
var express = require('express'); 
var app  = express();        // create our app w/ express 
var port  = process.env.PORT || 8080;    // set the port 
var bodyParser = require('body-parser'); 
var methodOverride = require('method-override') 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 

app.use(function(req, res, next) { 
    //the code hits this point! 
    var data = ''; 
    req.on('data', function(chunk) { 
     data += chunk; 
    }); 
    req.on('end', function() { 
     req.rawBody = data; 
     next(); 
    }); 
    console.log(data); 
}); 
app.use(methodOverride()); 
// routes ====================================================================== 
require('./routes.js')(app); 

// listen (start app with node server.js) ====================================== 
app.listen(port); 
console.log("App listening on port " + port); 

route.js

module.exports = function (app) { 
    app.post('/api/postding', function (req, res) { 
     console.log(req.body); 
     console.log(req.rawBody); 
     res.send({"test":"data"}); 
    }) 
} 

这是工作的我的电脑

当我发布{ “名称:” hoer“}通过REST客户端,控制台输出是

App listening on port 8080 

{} 
{"name:"hoer"} 
+0

你是什么意思?在哪里使用? – Pindakaas

+0

看到我的工作代码相同的代码,实际上你可以把app.use()以任何顺序,无关紧要 –

+0

现在尝试发布这个无效的json:{“name:”hoer“}。现在会发生什么? – Pindakaas