node-pre-gyp ERR! not ok
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node-pre-gyp ERR! not ok相关的知识,希望对你有一定的参考价值。
参考技术A root账户权限执行npm,而npm默认是不适用root权限创建内容,因此会出现权限问题而导致失败,加上参数--unsafe-perm=true --allow-root即可解决问题如何在 Ok 上打开 Result 或在 Err 上从函数返回?
【中文标题】如何在 Ok 上打开 Result 或在 Err 上从函数返回?【英文标题】:How do you unwrap a Result on Ok or return from the function on Err? 【发布时间】:2019-06-04 20:09:18 【问题描述】:我有一个函数调用另一个返回Result
的函数。我需要检查Result
是Ok
还是Err
,如果是Err
,我需要从我的函数中提早return
。这就是我现在正在做的事情:
match callable(&mut param)
Ok(_v) => (),
Err(_e) => return,
;
有没有更惯用的 Rust 方法来做到这一点?
【问题讨论】:
另见Unwrap or continue in a loop 【参考方案1】:您可以使用我的unwrap_or crate 来完成此操作。
你可以这样做:
unwrap_or_ok!(callable(&mut param), _, return);
如果你想要结果并返回错误,你可以这样做:
let v = unwrap_or_ok!(callable(&mut param), error, return error);
【讨论】:
【参考方案2】:您可以创建一个宏:
macro_rules! unwrap_or_return
( $e:expr ) =>
match $e
Ok(x) => x,
Err(_) => return,
fn callable(param: &mut i32) -> Result<i32, ()>
Ok(*param)
fn main()
let mut param = 0;
let res = unwrap_or_return!(callable(&mut param));
println!(":?", res);
请注意,我不建议放弃错误。 Rust 的错误处理非常符合人体工程学,所以我会返回错误,即使只是记录它:
fn callable(param: &mut i32) -> Result<i32, ()>
Ok(*param)
fn run() -> Result<(), ()>
let mut param = 0;
let res = callable(&mut param)?;
println!(":?", res);
Ok(())
fn main()
if let Err(()) = run()
println!("Oops, something went wrong!");
【讨论】:
谢谢。我还更改了您的宏以允许调用者指定是return
还是continue
。这是惯用的锈吗?
您在此处创建的宏和?
运算符有什么区别?
@Raul ?
运算符只能在返回 Try
实现者的函数中使用。 OP想要从一个返回unit的函数返回,而unit没有实现Try
。
通过添加返回Result
的run()
来添加间接是个好主意,原因有两个:1)在run()
内部,您可以使用?
来处理错误返回; 2)然后您可以在一个地方记录/处理所有错误返回。 IMO,这比创建宏要好。
@Boiethios 没关系。 main() 是否可以返回结果并不重要。我的意思是:当函数foo
返回 () 并且我们还想使用 ?要在foo
中提前返回,最好添加一层bar() -> Result()
,其中包含允许的实际代码?提前返回,然后foo
将调用bar
并记录错误。【参考方案3】:
如果两个函数都返回Result<doesn't matter, same T>
,您可以在调用行的末尾添加?
。
fn caller() -> Result<Str, i32>
let number = job()?; // <-- if job return error this function return/end here
// otherwise the value of Ok will assign to number
Ok(format!("the number is ", number))
fn job() -> Result<i32, i32>
// do something
Err(3)
Option<T>
也可以使用相同的模式。
【讨论】:
从 OP 示例代码中可以清楚地看出情况并非如此:Err(_e) => return,
所有人都认为这不是上述问题的答案。我记得有一些这样的语法,但不是确切的,直到现在我才找到它。非常感谢答案!以上是关于node-pre-gyp ERR! not ok的主要内容,如果未能解决你的问题,请参考以下文章
NPM 问题:Node-pre-gyp。使用 node-pre-gyp https 下载请求
离子“ERR_CLEARTEXT_NOT_PERMITTED”
Cordova 加载资源失败:net::ERR_FILE_NOT_FOUND