2017-09-01 81 views
0

我是express.js和后端路由的新手。下面是我的服务器到目前为止的确切错误和源代码。任何问题的方向,将不胜感激。我已经尝试使用res.end()以及纯文本,它仍然返回相同的错误。使用moment.js快速路由问题

谢谢大家。

_http_outgoing.js:489 

throw new Error('Can\'t set headers after they are sent.'); 
^ 
Error: Can't set headers after they are sent. 
    at validateHeader (_http_outgoing.js:489:11) 
    at ServerResponse.setHeader (_http_outgoing.js:496:3) 
    at Array.write (/app/node_modules/finalhandler/index.js:254:9) 
    at listener (/app/node_modules/on-finished/index.js:169:15) 
    at onFinish (/app/node_modules/on-finished/index.js:100:5) 
    at callback (/app/node_modules/ee-first/index.js:55:10) 
    at IncomingMessage.onevent (/app/node_modules/ee-first/index.js:93:5) 
    at emitNone (events.js:105:13) 
    at IncomingMessage.emit (events.js:207:7) 
    at endReadableNT (_stream_readable.js:1059:12) 

`

这个代码:

`

//server.js 

// Set static routes and set view engine as pug 
app.use(express.static('public')); 
app.set('view engine', 'pug'); 


// Pug entry point to API 

app.get('/', function (req, res) { 
    res.render('index', { title: 'Timestamp Microservice API'}) 
}); 

app.get('/:time',function (req,res, moment) { 
    var time = req.params.time; 
    return moment(time, 'MM-DD-YYYY').isValid(); 
}); 



// listen for requests :) 

var listener = app.listen(process.env.PORT, function() { 
    console.log('Your app is listening on port ' + listener.address().port); 
}); 

```

+0

为什么你有时间作为你的获得处理程序的参数?只需在你的单位顶部放置通常需要的时刻。 'res.end()'也是正确的方法。 get请求是异步的,所以返回很可能在express中被忽略。第三个参数是'next'回调,如果你不处理请求,这就是你所调用的。 – Keith

+0

时刻是一个处理程序,因为如果我尝试在回调中使用时刻的方法,express会返回一个未定义的错误。 –

+0

如果您在javascript代码的顶部定义了'var moment = require('moment')',那么它不能是未定义的。就像我说的那样,第三个参数是'next'处理程序,如果您不处理请求,就会调用它。另外,你的路由'/:time'会捕获根URL中的所有内容,也许'/ time /:time'可能会更好..然后你会从url调用'/ time/09-01-2017' – Keith

回答

0
app.get('/:time',function (req,res, moment) { 
    var time = req.params.time; 
    return moment(time, 'MM-DD-YYYY').isValid(); 
}); 

在上面的代码,你基本上已经暴露了下一个处理程序和称之为时刻。

要访问片刻,只需将var moment = require('moment');放置在单位的顶部,而不需要传入任何参数。

接下来,如果你想要做的所有事情都是使用momentjs的valididate日期,那么只需res.end就是结果。

例如。

app.get('/:time',function (req,res) { 
    var time = req.params.time; 
    res.end(moment(time, 'MM-DD-YYYY').isValid()); 
}); 
在上述路线

另外,我们有/:time这将匹配的网址一样/anything你能做到这一点,但通常你会申请一个路线是这样的..如.. app.get('/time/:time',这将然后匹配的URL像/time/09-01-2017停止来自index.html favicon.ico等的冲突。