2017-03-02 22 views
3

対JSONを送信するには、我々はExpressで、このエラーハンドラを持っている:400/500エラーハンドラ - HTML

app.use(function (err, req, res, next) { 

    res.status(err.status || 500); 

    const stck = String(err.stack || err).split('\n').filter(function (s) { 
    return !String(s).match(/\/node_modules\// && String(s).match(/\//)); 
    }); 

    const joined = stck.join('\n'); 
    console.error(joined); 

    const isProd = process.env.NODE_ENV === 'production'; 

    const message = res.locals.message = (err.message || err); 
    const shortStackTrace = res.locals.shortStackTrace = isProd ? '' : joined; 
    const fullStackTrace = res.locals.fullStackTrace = isProd ? '': (err.stack || err); 


    if (req.headers['Content-Type'] === 'application/json') { 
    res.json({ 
     message: message, 
     shortStackTrace: shortStackTrace, 
     fullStackTrace: fullStackTrace 
    }); 
    } 
    else { 
    //locals for template have already been set 
    res.render('error'); 
    } 

}); 

私の質問です - 私たちは、要求の種類に応じて、JSONまたはHTMLのどちらかを返送します。私はContent-Typeヘッダーを見てこれを行うための最良の方法だと仮定します。私がチェックしなければならない他の方法はありますか?

Content-Typeヘッダーは「content-type」(小文字)と呼ばれることはありませんか?

答えて

2

私は(これは404エラーのためですが、それは重要ではありません)、次を使用して好む:

if (req.accepts('html')) { 
    // Respond with html page. 
    fs.readFile('404.html', 'utf-8', function(err, page) { 
    res.writeHead(404, { 'Content-Type': 'text/html' }); 
    res.write(page); 
    res.end(); 
    }); 
} else { 
    if (req.accepts('json')) { 
    // Respond with json. 
    res.status(404).send({ error: 'Not found' }); 
    } else { 
    // Default to plain-text. send() 
    res.status(404).type('txt').send('Not found'); 
    } 
} 

基本的にあなたが応答として送信すべきかを調べるためにreqオブジェクトのacceptsメソッドを使用することができます。

+0

ありがとう、私はreq.acceptsメソッドがどのように動作するかを見ていきます –

関連する問題