2017-09-01 11 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要求は非同期であるため、返品は急行ではほとんど無視されます。 3番目のパラメータは 'next'コールバックです。リクエストを処理しない場合は、これを呼び出します。 – Keith

+0

モーメントは、コールバック内でモーメントのメソッドを使用しようとすると、明示的な返り値が未定義のエラーであるため、モーメントがそこにあるハンドラです。 –

+0

javascriptコードの先頭に 'var moment = require( 'moment')'を定義した場合、それを未定義にすることはできません。 3番目のパラメータが 'next'ハンドラであると言ったように、リクエストを処理しない場合、これが呼び出されます。あなたのルート '/:time'は、ルートURLからすべてを捕まえるでしょう。'/time /:time'がもっと良いかもしれません。あなたは '/ time/09-01-2017'のようにurlから呼び出すでしょう。 – Keith

答えて

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

上記のコードで使用すると、基本的に次のハンドラを公開しており、それは瞬間と呼ばれる。

momentjsにアクセスするには、ユニットの先頭に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()); 
}); 

私たちは、これはあなたがこれを行うことができます /anythingのようなURLにマッチする /:time持っているが、通常、あなたがこのような何かのためにルートを適用する...例えば... app.get('/time/:time',これは、URLの /time/09-01-2017などが一致します index.html favicon.icoなどからの衝突を停止する

関連する問題