GVKun编程网logo

如何从快速“路由器”中调用的另一个函数返回“res”?(路由的replace)

1

在本文中,我们将给您介绍关于如何从快速“路由器”中调用的另一个函数返回“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”?(路由的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.bodyreq.params 使用 ''Joi'',joi 是 JavaScript 最强大的架构描述语言和数据验证器,请检查此 article

(res) => res.json() 在 Promise 捕获中有什么作用?

(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'

如何解决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 模拟器 内点击一个,应用程序就会崩溃并出现错误:

  1. 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

  1. <Entry Grid.Row="2" Grid.Column="1" ClearButtonVisibility="WhileEditing" Keyboard="Numeric" Text="15" TextChanged="PriceEntry_TextChanged" />
  2. <Entry Grid.Row="2" Grid.Column="2" ClearButtonVisibility="WhileEditing" Keyboard="Numeric" Text="0" TextChanged="AmountEntry_TextChanged" />

这就是我在 XAML 中定义条目的方式。我希望我的应用专门在 Android 4.4 下运行。怎么办?

解决方法

我能够重现这个问题。

要解决此问题,请尝试将以下代码添加到 MainActivity.cs OnCreate 方法中:

  1. 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或.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 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头信息,

当状态码为301302时(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头有关。浏览器首先会判断状态码,只有当状态码是:301302时,才会根据Location头中的URL进行跳转。

所以,使用location()设置头信息,而不设置状态码或状态码不是301302,并不会发生重定向:

res.location(''http://itbilu.com'');
res.sent(200);

而使用redirect()设置的状态码不是301302也不会发生跳转:

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()等相关知识的信息别忘了在本站进行查找喔。

本文标签: