小编Thi*_*ddi的帖子

Dagger 2注入构造函数

我开始在我正在开发的应用程序中使用Dagger 2,但我对Dagger 2的工作方式有一些疑问.

我得到了@Provides方法和@Inject注释背后的所有逻辑来初始化你的依赖关系,但@Inject注释到类构造函数有点让我头疼.

例如:

我的应用程序,我有一个模块定义,ContextModule,以检索我的应用程序的上下文:

ContextModule.java

@Module
public class ContextModule {

    private final Context context;

    public ContextModule(Context context) {
        this.context = context;
    }

    @Provides
    public Context context() {
        return this.context;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的BaseActivityComponent使用此模块:

BaseActivityComponent.java

@BaseActivityScope
@Component(modules = ContextModule.class)
public interface BaseActivityComponent {
    void injectBaseActivity(BaseActivity baseActivity);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止很好..然后我有一个AuthController类,这取决于上下文,我想在我的BaseActivity中注入它.所以在我的AuthControllers.class中我有类似的东西:

public class AuthController {

    private Context context;

    @Inject
    public AuthController(Context context) {
        this.context = context;
    }

    public void auth() {
        // DO STUFF WITH CONTEXT
    }
}
Run Code Online (Sandbox Code Playgroud)

我将它注入我的BaseActivity中,如:

public class BaseActivity extends …
Run Code Online (Sandbox Code Playgroud)

java android constructor dependency-injection dagger-2

28
推荐指数
1
解决办法
8497
查看次数

如何将 PropTypes.shape 与 Typescript 一起使用

我正在将 React 应用程序从 Javascript 重构为 Typescript,但在迁移时遇到一些问题,尤其是 PropType shape。我的代码现在看起来像这样:

import React from 'react';
import PropTypes from 'prop-types';

interface FooterProps {
  labels: FooterLabels;
}

interface FooterLabels {
  body: string;
}

const Footer: React.FC<FooterProps> = ({ labels }) => (
  <div className="footer">
    {/* ... */}
  </div>
);

Footer.propTypes = {
  labels: PropTypes.shape({
    body: PropTypes.string.isRequired
  }).isRequired
};

export default Footer;
Run Code Online (Sandbox Code Playgroud)

但我在 PropTypes 中遇到错误:

Type 'Validator<InferProps<{ body: Validator<string>; }>>' is not assignable to type 'Validator<FooterLabels>'.
  Type 'InferProps<{ body: Validator<string>; }>' is not assignable to …
Run Code Online (Sandbox Code Playgroud)

types typescript reactjs react-proptypes

10
推荐指数
2
解决办法
8135
查看次数

mongoose .find()方法返回具有不需要的属性的对象

所以,我已经和猫鼬一起工作了一段时间,我发现了一些非常奇怪的东西.如果有人能够启发我会很棒.

问题是,当使用mongoose的.find()方法时,我得到的对象充满了属性,我不知道它来自哪里(我猜它们是内置属性,但无论如何)和我想只通过属性I .select()进行迭代.得到它了?没有?好的......解释得更好:

我声明了我的架构和模型:

var mySchema = mongoose.Schema({
  name: String,
  prop1: String,
  prop2: String,
  prop3: String
})
var myModel = DB.model('myDataBase', mySchema)
Run Code Online (Sandbox Code Playgroud)

然后我想找一个带有名字的文件,比方说,约翰并检索除"名字"字段以外的所有文件,所以我去了:

myModel.find({name: 'John'}, '-name', function(err, results){
  log(results[0])
}
Run Code Online (Sandbox Code Playgroud)

和日志(结果[0])日志

{ prop1: 'one',
  prop2: 'two',
  prop3: 'three' }
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但问题是,现在我想迭代这些属性并逐个检查,我不确定每个结果会有多少'道具',所以我想做类似的事情:

for(var key in results[0]){
  log(key)
}
Run Code Online (Sandbox Code Playgroud)

所以,我希望它会记录'prop1','prop2'和'prop3',但不是!好吧,我得到道具1,2和3,但我也得到了很多其他的属性和功能,如:isNew,error,_maxListeners,_doc等.不仅这些额外属性,我还得到'name'属性,我从选择中排除了一个(并且它被排除在外,如第一个日志中所示).怪啊?

可是等等!还有更多!我在网上搜索过,发现有些人说"Dude,迭代对象属性时使用hasOwnProperty方法!".所以我去了:

for (var key in results[0]){
  if (results[0].hasOwnProperty(key)) log(key)
}
Run Code Online (Sandbox Code Playgroud)

日志结果是一些属性(具体来说:$ __,isNew,error,_maxListeners,_doc,_pres,_posts,save,_events)并且不包括我想要的任何道具.

我的问题是,我怎么能只迭代道具1,2和3,排除这些,我不知道,内置属性和我在参数中明确排除的属性?(ps:我在想一个不需要将我的对象转换成数组的解决方案,如果可能的话)

此外,这不是一个问题,但出于好奇,这些属性来自哪里?为什么它们出现在for循环中而不是在我记录对象时?为什么我排除的属性('-name')也出现在for循环中?如果它没有识别刚刚记录的属性,那么它是什么hasOwnProperty?

感谢您的时间和帮助!再见!

javascript properties mongoose node.js

8
推荐指数
2
解决办法
1万
查看次数

如何真正杀死child_process nodejs

我正在使用带有Nodejs的mocha来测试我的restApi.当我运行mocha时,我告诉我的测试创建child_process并运行API,以便我可以向它发出请求.

问题是每当测试退出(完成或崩溃)时,似乎API在后台运行.我在这里看到了一些答案,指示在主进程退出时手动终止子进程.所以我这样做了:

export function startProcess(done) {
    const child = spawn('babel-node', ["app.js"]);

    child.stdout.on("data", function(data) {
        data = data.toString();
        // console.log(data.toString());

        if(data.indexOf("Server online") > -1) done();
    });

    child.stderr.on('data', function(err) {
        console.log("ERROR: ", err.toString());
    });

    child.on('exit', function(code) {
        console.log("PROPERLY EXITING");
        console.log("Child process exited with code", code);
    });

    process.on('exit', function(code) {
        console.log("Killing child process");
        child.kill();
        console.log("Main process exited with code", code);
    });
}
Run Code Online (Sandbox Code Playgroud)

当主进程退出时,它会记录"Killing child process",这意味着child.kill()确实被称为.但是如果我再次尝试运行我的测试,当调用spawn命令时,API会抛出错误

错误:听EADDRINUSE ::: 3300

,意味着API仍在运行,并且采用了该端口地址.

所以我必须运行sudo pkill node以真正杀死所有节点进程然后npm test再次工作.

我错过了什么吗?这真的是实现我期待的方式吗?

我想过 …

child-process node.js

6
推荐指数
1
解决办法
761
查看次数

eslint 在将特定文件添加到 ignorePatterns 时忽略所有文件

我正在尝试在 Next.js 项目中实现 eslint,但我不想next.config.js被 lint。我尝试添加ignorePatterns.eslintrc.json,添加.eslintignore文件并添加eslintIgnore属性到我的package.json,它们似乎都有相同的错误行为。

当只留下目录路径时,它会按预期工作:

// .eslintrc.json

{
  "env": {
    "browser": true
  },
  "extends": ["airbnb", "plugin:@typescript-eslint/recommended"],
  "plugins": ["react", "react-hooks", "@typescript-eslint", "prettier"],
  "parser": "@typescript-eslint/parser",
  "ignorePatterns": ["graphql/generated/", "third-party/"],
  "rules": { /* ... */ },
  "settings": {
    "import/parsers": {
      "@typescript-eslint/parser": [".ts", ".tsx"]
    },
    "import/resolver": {
      "typescript": {}
    },
    "polyfills": ["fetch"]
  }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

/Users/mac-user/development/my-project/next.config.js
  1:18  error  Require statement not part of import statement  @typescript-eslint/no-var-requires
  2:17  error  Require statement not part …
Run Code Online (Sandbox Code Playgroud)

javascript node.js typescript eslint eslintignore

6
推荐指数
1
解决办法
4645
查看次数

如何使用nodejs处理请求超时

因此,我向服务器发出此请求,并设置了超时,并且我想处理超时事件,但我也想处理“中止”事件,并且每个事件都不同。我设法通过快速修复来做到这一点,但我想知道是否有更好的方法来做到这一点。代码如下所示:

makeRequest = function(json, cb){
    var requestError
    request({
        url: REQUEST_URL,
        json: json,
        timeout: 3000,
        headers: {
            'Content-Type': 'application/json'
        }
     }, function(err, res, body){
         if(err) requestError = err
         else cb(null, res, body)
     }).on('abort', function(){
         setTimeout(function({  
             if(requestError != 'ETIMEDOUT') cb(httpStatusCode.REQUEST_TIMEDOUT)
             else cb(httpStatusCode.REQUEST_ABORTED
         }, 1000)
     })
}
Run Code Online (Sandbox Code Playgroud)

我注意到在超时事件中,按此顺序触发了“abort”事件并调用了请求回调,因此我使用 setTimeout 函数来等待请求回调,然后处理“abort”侦听器中的错误。这似乎是一种愚蠢的方法,我在网上搜索并没有找到只处理回调事件的方法。我还注意到超时会触发 on.('error', function(err){}) 事件,我可以在其中处理错误,但它也会调用 on.('abort', function(){}) 事件我最终调用了主回调 (cb) 两次,导致我的应用程序崩溃。

有没有一种方法可以让我有一个仅用于超时的事件和一个仅用于中止的事件,这样我就不必使用 setTimeout ?

或者我的 req 对象中是否有任何属性可以检查该请求是否超时?

或者您有其他建议以不那么难看的方式解决我的问题吗?

我正在使用 nodejs 0.12.2 并请求 2.55.0 谢谢!

javascript timeout request node.js

5
推荐指数
1
解决办法
2万
查看次数

使用 Joi,如何将 .or 用于递归对象

我正在使用节点模块 Joi 进行一些验证,但在使用 .or() 方法时遇到了问题。

在他们的文档中,他们将用途指定为:

var schema = Joi.object().keys({
    a: Joi.any(),
    b: Joi.any()
}).or('a', 'b');
Run Code Online (Sandbox Code Playgroud)

但是我正在尝试验证一个对象,并且我想使用 .or() 来检查嵌套在不同属性下的属性,明白了吗?就像是:

var schema = Joi.object().keys({
  body:{
    device:{
      smthelse: Joi.any(),
      ua: Joi.string()
    }
  },
  headers:{
    'user-agent': Joi.string()      
}).or('body.device.ua', 'headers.user-agent');
Run Code Online (Sandbox Code Playgroud)

但我似乎无法让它发挥作用。有谁知道我是否遗漏了什么?对于嵌套对象,用户 .or() 是这样吗?

谢谢!

javascript validation node.js node-modules joi

4
推荐指数
1
解决办法
5191
查看次数

如何使用 JSS 为 body 元素添加样式?

我正在使用 react-jss 构建一个应用程序来为我的组件设置样式,并想知道是否可以向顶级元素(如htmlbody)添加样式。

为了说明这一点,我有这个简单的 NotFound 组件,我用 react-jss 对其进行了样式设置。样式工作正常,但问题是body元素有一个我想删除的默认边距。

NotFound.js

import React from 'react';
import injectSheet from 'react-jss';

const styles = {
    notFound: {
        fontFamily: 'Roboto',
        backgroundColor: 'blue',
        color: 'white'
    }
}

function NotFound({ classes }) {
  return (
    <div className={classes.notFound}>
      NOT FOUND
    </div>
  )
}

export default injectSheet(styles)(NotFound);
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

有谁知道是否可以使用 css-in-js 删除此边距?(我想避免使用 css)

javascript css reactjs jss css-in-js

3
推荐指数
1
解决办法
4181
查看次数

JavaScript - 扩展错误时如何获取子类名称

我在我的应用程序中创建了一些自定义 Erros,我想稍后使用构造函数名称检查它们。问题是当我在我的类中扩展 Error 时,constructor.name 总是“Error”,而不是我实际给它的名字。

我正在做一些测试,并注意到 Error 类会发生这种情况,但我创建的任何其他自定义类都不会发生这种情况。例如:

class CustomClass {
  constructor(msg) {}
}

class OtherClass extends CustomClass {
   constructor(msg) {
     super(msg);
}

class CustomError extends Error {
  constructor(msg) {
    super(msg);
  }
}

const e = new CustomError("There was an error");
const otherClass = new OtherClass("This is a class");

console.log(otherClass.constructor.name); // "OtherClass" <- ok!
console.log(e.constructor.name); // "Error" <- not ok! expected "CustomError"
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?

我以为我可以做这样的事情:

class CustomError extends Error {
  constructor(msg) {
    super(msg);
  }

  getName() {
    return "CustomError";
  }
}

const …
Run Code Online (Sandbox Code Playgroud)

javascript constructor class extend node.js

1
推荐指数
1
解决办法
2741
查看次数

尝试在 Android 应用程序中实施 AdMob 时出现“无效的应用程序 ID”错误

我已经关注 google admob vidoes 3 天了,但我在 logCat 中收到运行时错误:

日志猫

进程:com.exafmpflle.android.happybirthdayyyy,PID:19319 java.lang.RuntimeException:无法获取提供程序com.google.android.gms.ads.MobileAdsInitProvider:java.lang.IllegalStateException:无效的应用程序ID。请按照此处的说明进行操作:** 查找您的应用 ID。

活动主体

xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawerLayout"
android:background="@drawable/january_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.exafmpflle.android.xxxxxxx.MainActivity">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageButton
        android:id="@+id/idbuttonfirst"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignTop="@+id/idbuttonsecond"
        android:layout_marginStart="79dp"
        android:background="@drawable/ic_iconaphoto"
        android:src="?attr/selectableItemBackground" />

    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        app:adSize="BANNER"
        app:adUnitId="ca-app-pub-52924220005747xx/xxxxxxxx"  />


</RelativeLayout>
<android.support.design.widget.NavigationView
    android:layout_gravity="start"
    android:id="@+id/nav_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:menu="@menu/navigation_menu" />
Run Code Online (Sandbox Code Playgroud)

AndroidMainfest
也在我的 Mainfest 中

<manifest 
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.exafmpflle.android.xxxxxxx"
android:installLocation="auto">

<!-- Include required 2 permissions for Google Mobile Ads to run-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-feature android:name="android.permission.CALL_PHONE" 
android:required="false" …
Run Code Online (Sandbox Code Playgroud)

java android admob

1
推荐指数
1
解决办法
1万
查看次数