2017-02-03 7 views
2

node-horsemanを使用してGoogleにログインし、GoogleアラートのUIを操作してRSSフィードを作成するコンポーネントがあります。私のプロジェクトでは、ユーザーがモジュールによって生成されたcookies.txtファイルを持っているかどうかを確認し、Googleにログインする必要があるのか​​、すでにRSSフィードを作成できるのかを確認します。真でなければならない場合、ブール値はFALSEです

フォームをレンダリングするための責任が私のコンポーネント:

import React, { Component, PropTypes } from 'react' 
import NewRSSForm from './NewRSSForm' 
import LoginForm from './LoginForm' 

class GoogleAlerts extends Component { 
    render() { 
    const { 
     hasCookies, 
     createRSSFeed, 
     createRSSFeedSuccess, 
     loginGoogle, 
     loginGoogleSuccess 
    } = this.props 

    return (
     <div> 
     { 
      hasCookies 
      ? <NewRSSForm 
       createRSSFeed={createRSSFeed} 
       createRSSFeedSuccess={createRSSFeedSuccess} 
       /> 
      : <LoginForm 
       loginGoogle={loginGoogle} 
       loginGoogleSuccess={loginGoogleSuccess} 
       /> 
     } 
     </div> 
    ) 
    } 
} 

GoogleAlerts.propTypes = { 
    hasCookies: PropTypes.bool, 
    createRSSFeed: PropTypes.func, 
    createRSSFeedSuccess: PropTypes.bool, 
    loginGoogle: PropTypes.func, 
    loginGoogleSuccess: PropTypes.bool, 
} 

export default GoogleAlerts 

シンプルで使いやすいです。エンドポイントは、ファイルが存在するフォルダの名前であるユーザidのファイルの存在をチェックし、trueまたはfalseのいずれかを返します。

* hasCookies() { 
    return fs.existsSync(User.cookiesLocation(this.id)) 
} 

クッキーから保存され、読まれなければならない場所のデフォルトのパスを返す静的メソッドがあるUserモデル:返された値をチェックすることによって

static cookiesLocation(userID) { 
    return `cookies/${userID}/cookies.txt` 
} 

は、私はそれがだはっきりと見ることができます正しいかどうかはファイルがあるかどうかの両方の条件ですが、奇妙なことに、falseの場合、コンポーネントはtrueのときに表示されると思われるフォームを表示しています。私はconsole.logでテストしましたが、それも正しいですが、どういうわけか間違った結果を表示することを主張しています。

答えて

0

問題が再来していました。ルートがアクセスされたときに、以下の方法が実行される:

export function checkForCookies(id) { 
    return { 
    [CALL_API]: { 
     endpoint: `/api/linked-accounts/users/${id}/has-cookies`, 
     method: 'GET', 
     headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json' 
     }, 
     types: [ HAS_COOKIES, HAS_COOKIES_SUCCESS, HAS_COOKIES_FAIL ] 
    } 
    } 
} 

... 

[HAS_COOKIES_SUCCESS]: (state, action) => ({ 
    ...state, 
    checkingCookies: false, 
    checkCookiesSuccess: true, 
    hasCookies: action.payload.hasCookies 
}), 

問題がhasCookies: action.payload.hasCookiesでした。私は、オブジェクト全体もたらし、​​からhasCookiesにアクセスすることを忘れてしまった:そのような

return ({hasCookies})

を、それはこのようにそれを返していました、そして私は、オブジェクトをテストしていたではなく、その値:

hasCookies: { 
    hasCookies: true/false 
} 
1

次の2つのisssuesている:(1)あなたは

むしろそれは(trueに評価する機能の)タイプですので、その戻り値に対して評価されていない、というhasCookies機能を

を起動していません(2)hasCookiesは、trueまたはfalseのブールリテラルではなく、string 'false'または 'true'として返される可能性が最も高いです。

JavaScriptがbooleanでないリテラルとの比較を行うとき、データ型からブール型への変換を行います。

以下の値がfalseに変換される:

  • ヌル。
  • NaN;
  • 0;
  • 空の文字列( ""); < - これはここに適用されます
  • 未定義です。

したがって、 "false"が評価されると、3進数式でfalseになると、実際にはtrueに解決されます。

ソリューション:

+0

申し訳ありませんが、私は間違いを見ませんでした。 'hasCookies'は' boolean'であると考えられます。 – mfgabriel92

+0

'hasCookies'は関数ですか? – Pineda

+0

それはAPIです。 Reduxはルートにアクセスするときにこの関数を実行し、その戻り値をチェックします。私は問題を見つけた、それに答える – mfgabriel92

0

あなたのhasCookies機能の戻り値をチェックされるのではなく、(常に真である)、その関数への参照。

以下の簡単な例を確認:それは何だから、我々はsomeFunctionsomeFunction()のブール評価にのみ興味ので、私は二重否定(!!を)やっている

someFunction = function() { 
 
    return false; 
 
} 
 

 
console.log(!!someFunction); //returns true 
 
console.log(!!someFunction()); //returns false

を三項式が求められる。


ので、のようなので、あなたのコードを変更:

return (
    <div> 
    { 
     hasCookies() 
     ? <NewRSSForm 
      createRSSFeed={createRSSFeed} 
      createRSSFeedSuccess={createRSSFeedSuccess} 
      /> 
     : <LoginForm 
      loginGoogle={loginGoogle} 
      loginGoogleSuccess={loginGoogleSuccess} 
      /> 
    } 
    </div> 
) 
+0

申し訳ありませんが、私は間違いを見ませんでした。 'hasCookies'は' boolean'であると考えられます。 – mfgabriel92

+1

@GabrielMFernandesですが、 'return fs.existsSync(User.cookiesLocation(this.id))'でも 'hasCookies'という関数がありますか? – Chris

+0

これはAPIです。 Reduxはルートにアクセスするときにこの関数を実行し、その戻り値をチェックします。私は問題を発見し、それに答えます。 – mfgabriel92

関連する問題