我正在为我的Web服务类分配作业,无法弄清楚如何处理空URL参数。这是我的代码:
app.get('/nachos/:x/:cheese/:tomatoes/:salsa/:hotsauce', (req, res) => {
var x = parseInt(req.params['x'])
var cheese = (req.params['cheese'])
var tomatoes = (req.params['tomatoes'])
var salsa = (req.params['salsa'])
var hotsauce = (req.params['hotsauce'])
res.send('You ordered ' + x + ' nacho(s) with ' + cheese + ', ' + tomatoes + ', ' + salsa + ', '
+ hotsauce + '.')})
此代码在填充所有参数的情况下都能正常工作。但是,如果不想,如何处理null参数,例如salsa并输入url localhost:port / nachos / 1 / cheese / tomatoes / hotsauce
您可以检查它们是否未定义,例如:
const cheese = req.params['cheese'] || '';
以这种方式传递参数,要求API用户以正确的顺序发送参数。要处理您想要的情况(一种成分丢失),您需要创建另一条路线来处理。但是您可以用另一种方式来执行此操作,例如将参数传递为query strings或什至在请求正文上发送它们(最好是非GET路由器)。
如果我阅读正确,问题是:
例如,如果我不想,如何处理
null
参数,salsa并输入URLlocalhost:port/nachos/1/cheese/tomatoes/hotsauce
您不会得到null
,它根本不会与路线匹配。
您可以将参数设为可选,例如:
app.get('/nachos/:x?/:cheese?/:tomatoes?/:salsa?/:hotsauce?', (req, res) => {
或添加要匹配的路线,这可能会失控。
app.get([
//...
'/nachos/:x/:cheese/:tomatoes',
'/nachos/:x/:cheese/:tomatoes/:hotsauce',
'/nachos/:x/:cheese/:tomatoes/:salsa/:hotsauce',
//...
], (req, res) => {
所有可选成分可能都属于查询字符串,如下所示:
/nachos/2?cheese=yes&tomatoes=yes&salsa=yes&hotsauce=yes
然后,您可以忽略其中任何一个选项并编写代码,这样,如果不存在,则默认为“ no”。因此,没有辣酱的订单可能是以下之一:
/nachos/2?cheese=yes&tomatoes=yes&salsa=yes&hotsauce=no
/nachos/2?cheese=yes&tomatoes=yes&salsa=yes
没有辣酱或莎莎酱的订单可能就是这样:
/nachos/2?cheese=yes&tomatoes=yes
然后,您的请求处理程序将如下所示:
const orderOptions = ["cheese", "tomatoes", "salsa", "hotsauce"];
app.get('/nachos/:x', (req, res) => {
console.log(req.query);
let text = orderOptions.map(item => {
return req.query[item] === "yes" ? item : null;
}).filter(item => !!item).join(", ");
res.send(`You ordered ${req.params.x} nacho(s) with ${text}.`);
});