在本文中,我们将给您介绍关于如何从快速“路由器”中调用的另一个函数返回“res”?的详细内容,并且为您解答路由的replace的相关问题,此外,我们还将为您提供关于(res)=>res.json()在
在本文中,我们将给您介绍关于如何从快速“路由器”中调用的另一个函数返回“res”?的详细内容,并且为您解答路由的replace的相关问题,此外,我们还将为您提供关于(res) => res.json() 在 Promise 捕获中有什么作用?、Android.Content.Res.Resources+NotFoundException: 'File res/drawable/abc_ic_clear_material.xml from drawable resource ID #0x7f07001d'、axios请求在.forEach或.map内均无效 请注意:我并没有添加.then(res=>consolse.log(res)只是为了使其简短还请注意:使用console.log代替axios.delete的效果很好、express url跳转(重定向)的实现:res.location() res.redirect()的知识。
本文目录一览:- 如何从快速“路由器”中调用的另一个函数返回“res”?(路由的replace)
- (res) => res.json() 在 Promise 捕获中有什么作用?
- Android.Content.Res.Resources+NotFoundException: 'File res/drawable/abc_ic_clear_material.xml from drawable resource ID #0x7f07001d'
- axios请求在.forEach或.map内均无效 请注意:我并没有添加.then(res=>consolse.log(res)只是为了使其简短还请注意:使用console.log代替axios.delete的效果很好
- express url跳转(重定向)的实现:res.location() res.redirect()
如何从快速“路由器”中调用的另一个函数返回“res”?(路由的replace)
如何解决如何从快速“路由器”中调用的另一个函数返回“res”?
我正在尝试做这样的事情,
// /api/auth
const validateFields = ({ name,email },res) => {
if (!name.trim()) return res.status(422).json({ error: ''name'' })
if (!email.trim()) return res.status(422).json({ error: ''email'' })
}
router.post(''/'',async (req,res) => {
const { name = '''',email = '''' } = req.body
validateFields({ name,res)
return res.end()
})
如果有人传递了一个无效的名字或电子邮件,比如说一个空字符串,前端收到了预期的错误,但后端(Expressjs)抛出了一个错误,
Error: Can''t set headers after they are sent
我有点被迫做以下事情,
const validateFields = ({ name,res) => {
if (!name.trim()) return res.status(422).json({ error: ''name'' })
if (!email.trim()) return res.status(422).json({ error: ''email'' })
return true
}
router.post(''/'',email = '''' } = req.body
const validFields = validateFields({ name,res)
if (validFields !== true) return
return res.end()
})
这是我唯一的选择吗?
解决方法
这不是唯一的编码方式,但您通常必须检查是否有错误,如果没有,则发送您的正常响应。
我个人不喜欢有时发送响应有时不发送响应的函数,因为这会混淆逻辑流程。我发现最好是创建一个发送所有可能响应的函数,或者使它成为一个只返回状态然后调用者发送响应的函数。或者,使用中间件设计,如果它发送响应,则处理不再继续(因为未调用 next()
)。
在这种特殊情况下,您可以只返回错误状态并让调用者发送最终响应。那么它总是一致的。响应总是由调用者发送,validateFields()
只返回一个结果:
const validateFields = ({ name,email }) => {
if (!name.trim()) return { status: 422,error: ''name'' };
if (!email.trim()) return { status: 422,error: ''email'' };
return { status: 200,ok: true };
}
router.post(''/'',async (req,res) => {
const { name = '''',email = '''' } = req.body;
const result = validateFields({ name,email });
res.status(result.status).json(result);
});
中间件设计可以这样工作:
const validateFields = (req,res,next) => {
const { name = '''',email = '''' } = req.body;
if (!name.trim()) return res.status(422).json({ error: ''name'' });
if (!email.trim()) return res.status(422).json({ error: ''email'' });
next();
}
router.post(''/'',validateFields,res) => {
res.send("ok");
});
,
对于验证 req.body
或 req.params
使用 ''Joi'',joi 是 JavaScript 最强大的架构描述语言和数据验证器,请检查此 article
(res) => res.json() 在 Promise 捕获中有什么作用?
.then
总是从传递给它的函数返回承诺。 res.json
返回一个 promise(不要问我为什么)。所以如果你真的想在解析json时抛出错误,这样做:
const postDataToAPI = async (path) => {
return await fetch(`/api${path}`,{
method: 'POST',headers: {
'Accept': 'application/json','Content-Type': 'application/json'
},}).then(function(res) {
if (!res.ok) {
return res.json().then(json => throw new Error(json));
}
return res;
}).then((res) => res.json());
};
如果您想合并两个 .then
,您可以这样做:
const postDataToAPI = async (path) => {
return await fetch(`/api${path}`,}).then(function(res) {
if (!res.ok) {
return res.json().then(json => { throw new Error(json) });
}
return res.json();
});
};
要仅使用 async/await,您可以这样做:
const postDataToAPI = async (path) => {
const res = await fetch(`/api${path}`,});
if (!res.ok) {
throw new Error(await res.json());
}
else {
return await res.json();
}
};
,
仅使用 await
语法:
const postDataToAPI = async path => {
try {
const res = await fetch(`/api${path}`,{
method: 'POST',headers: {
'Accept': 'application/json','Content-Type': 'application/json'
},});
const data = await res.json();
return data;
} catch(err) {
console.log("Error!",err)
}
};
Android.Content.Res.Resources+NotFoundException: 'File res/drawable/abc_ic_clear_material.xml from drawable resource ID #0x7f07001d'
如何解决Android.Content.Res.Resources+NotFoundException: ''File res/drawable/abc_ic_clear_material.xml from drawable resource ID #0x7f07001d''
我是 Xamarin 的新手(以及 Xamarin.Forms,如果它们不同的话)。我在页面上放置了一些条目。一旦我在真正的 Android 4.4 设备上或在 4.4 模拟器 内点击一个,应用程序就会崩溃并出现错误:
Android.Content.Res.Resources+NotFoundException: ''File res/drawable/abc_ic_clear_material.xml from drawable resource ID #0x7f07001d''
在 Android 6.0 真实设备和 9.0 模拟器 上不会崩溃。我认为崩溃与 ClearButtonVisibility="WhileEditing"
有某种关系,因为缺少 XML 中有clear。
<Entry Grid.Row="2" Grid.Column="1" ClearButtonVisibility="WhileEditing" Keyboard="Numeric" Text="15" TextChanged="PriceEntry_TextChanged" />
<Entry Grid.Row="2" Grid.Column="2" ClearButtonVisibility="WhileEditing" Keyboard="Numeric" Text="0" TextChanged="AmountEntry_TextChanged" />
这就是我在 XAML 中定义条目的方式。我希望我的应用专门在 Android 4.4 下运行。怎么办?
解决方法
我能够重现这个问题。
要解决此问题,请尝试将以下代码添加到 MainActivity.cs OnCreate 方法中:
Android.Support.V7.App.AppCompatDelegate.CompatVectorFromResourcesEnabled = true;
如果您有任何其他问题或疑虑,请告诉我。
axios请求在.forEach或.map内均无效 请注意:我并没有添加.then(res=>consolse.log(res)只是为了使其简短还请注意:使用console.log代替axios.delete的效果很好
如何解决axios请求在.forEach或.map内均无效 请注意:我并没有添加.then(res=>consolse.log(res)只是为了使其简短还请注意:使用console.log代替axios.delete的效果很好
我正在尝试创建删除按钮,以删除一组对象而不是一个对象,但是axios请求在forEach循环中不起作用。
function handleClick(e) {
cont GetByName = axios.get(''my/api/link'').filter(i => i.mylist === `${name}`)
GetByName.forEach(i => axios.delete(''my/api/link''+i.id))
}
请注意:我并没有添加.then(res=>consolse.log(res)
只是为了使其简短。
还请注意:使用console.log
代替axios.delete
的效果很好。
也许我可以用另一种方法解释我的问题
const [Id,setId] = useState(null)
function handleClick(e) {
cont GetByName = axios.get(''my/api/link'').filter(i => i.mylist === `${name}`)
GetByName.forEach(i => setId(i.id))
console.log(Id)
}
此console.log
返回null
解决方法
使用setTimeout(() => {},0))
function handleClick(e) {
cont GetByName = axios.get(''my/api/link'').filter(i => i.mylist === `${name}`)
GetByName.forEach(i => {
setTimeout(() => {
axios.delete(''my/api/link''+i.id)
},0))
})
}
express url跳转(重定向)的实现:res.location() res.redirect()
Express 是一个基于Node.js 实现的web框架,其响应HTTP请求的response对象中有两个响应url跳转方法res.location() res.redirect(),可以实现301 302重定向
1 res.location()
2 re.redirect()
res.location(path)
设置响应的HTTP Location头,path可以是一下几种设置形式:
res.location(''/foo/bar'')
res.location(''../foo'');
res.location(''http://baidu.com'')
res.location(''back'')
path参数可以是一个绝对路径 相对路径 标准的url或是’back‘.当path是’back‘时,响应的location头会被设置为当前请求的referer头,当referer头不存在时会被设置为’/‘
Express通过Location头将指定的URL字符串传递给浏览器,它并不会对指定的字符串进行验证(除了’back‘外)。而浏览器则负责将当前的url重定义到响应头location中指定的url;
res.redirect([status,]path)
status:{number}表示要设置的HTTP状态码
path:{string}要设置到location头中的URL
重定义到path所指定的URL,重定向时可以同时指定HTTP状态码,不指定状态码默认是302
与location相比,redirect除了要设置path外,还可以指定一个状态码,而path参数则于location完全相同,
使用redirect()
重定向时,可以是几下几种设置方式:
res.redirect(''/foo/bar'');
res.redirect(''http://itbilu.com'');
res.redirect(301, ''http://itbilu.com'');
res.redirect(''http://itbilu.com'', 301);
res.redirect(''../login''); // /blog/post/1 -> /blog/login
res.redirect(''back'');
url重定向原理
进行url重定向时,服务器只在响应信息的http信息中设置http状态码和location头信息,
当状态码为301
或302
时(301
-永久重定向、302
-临时重定向),表示资源位置发生了改变,需要进行重定向。
Location
头信息表示了资源的改变的位置,即:要跳重定向的URL。
location与redirect的比较
Express的response对象,时对Node.js原生对象ServerResponse的扩展,location方法只会设置location头,而redirect() 除了
可以设置location头外还可以手动或者自动设置HTTP状态码,理论上讲两者都可以实现重定向。
location()
方法
location()
方法实现过程大致如下:
res.location = function(url){
var req = this.req;
// "back" 是 referrer的别名
if (''back'' == url) url = req.get(''Referrer'') || ''/'';
// 设置Lcation
this.setHeader(''Location'', url);
return this;
};
从以上代码可以看出,location()
方法本质上是调用了ServerResponse
对象的setHeader()
方法,但并没有设置状态码。通过location()
设置头信息后,其后的代码还会执行。
使用location()
方法实现URL的重定向,还要手动设置HTTP状态码
:
res.location(''http://itbilu.com'');
res.statusCode = 301;
如果需要立即返回响应信息,还要调用end()
方法:
res.location(''http://itbilu.com'');
res.statusCode = 301;
res.end(''响应的内容'');
// 或
res.location(''http://itbilu.com'');
res.sent(302);
redirect()
方法
redirect()
方法实现过程大致如下:
res.redirect = function(url){
var head = ''HEAD'' == this.req.method;
var status = 302;
var body;
// 一些处理
……
// 通过 location 方法设置头信息
this.location(url);
// 另一些处理
……
// 设置状态并返回响应
this.statusCode = status;
this.set(''Content-Length'', Buffer.byteLength(body));
this.end(head ? null : body);
};
从以上代码可以看出,redirect()
方法是对location()
方法的扩展。通过location()
设置Loction
头后,设置HTTP状态码
,最后通过ServerResponse
对象的end()
方法返回响应信息。调用redirect()
方法后,其后的代码都不会被执行。
3.3 重定向与不重定向
在使用的过程中,redirect()
方法大多能重定向成功,而location()
方法则不太确定,有时可以成功有时不能成功。这与我们的用法有关。
上面讲过,URL重定向是在浏览器端完成的,而URL重定向与HTTP状态码
和Location
头有关。浏览器首先会判断状态码,只有当状态码是:301
或302
时,才会根据Location
头中的URL进行跳转。
所以,使用location()
设置头信息,而不设置状态码或状态码不是301
或302
,并不会发生重定向:
res.location(''http://itbilu.com'');
res.sent(200);
而使用redirect()
设置的状态码不是301
或302
也不会发生跳转:
res.redirect(200, ''http://itbilu.com'');
参考:https://www.jb51.net/article/110624.htm
关于如何从快速“路由器”中调用的另一个函数返回“res”?和路由的replace的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于(res) => res.json() 在 Promise 捕获中有什么作用?、Android.Content.Res.Resources+NotFoundException: 'File res/drawable/abc_ic_clear_material.xml from drawable resource ID #0x7f07001d'、axios请求在.forEach或.map内均无效 请注意:我并没有添加.then(res=>consolse.log(res)只是为了使其简短还请注意:使用console.log代替axios.delete的效果很好、express url跳转(重定向)的实现:res.location() res.redirect()等相关知识的信息别忘了在本站进行查找喔。
本文标签: