我有一个组件利用node-horseman
登录Google并操纵Google快讯的用户界面,创建RSS Feed。在我的项目中,我检查用户是否有模块生成的cookies.txt
文件,以检查它是否应该登录Google或已经被允许创建RSS Feed。
我负责呈现表单的组件:
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
有一个静态方法,用于返回存储和存储cookie的位置的默认路径:
static cookiesLocation(userID) {
return `cookies/${userID}/cookies.txt`
}
通过检查返回的值,我可以清楚地看到它是正确的,无论是否存在文件的条件,但奇怪的是,当它false
时,组件显示的形式是假设显示的时候true
。我用console.log
进行了测试,这也是正确的,但不知怎的,它坚持显示错误的结果。
答案 0 :(得分:1)
你有两个问题:
(1)你没有调用那个hasCookies
函数,所以没有评估它的返回值,而是它的类型(将评估为true
的函数)
(2)hasCookies
最有可能以string
'false'或'true'而不是true
或false
的布尔字面值返回。
当javascript与非布尔文字进行比较时,它会从数据类型转换为布尔类型。
以下值转换为false:
因此,当您希望“false”在三元表达式中求值为false
时,它实际上会解析为true。
解决方案:
答案 1 :(得分:0)
您没有检查hasCookies
函数的返回值,而是检查该函数的引用(始终为真)。
检查以下简单示例:
someFunction = function() {
return false;
}
console.log(!!someFunction); //returns true
console.log(!!someFunction()); //returns false
我正在进行双重否定(!!
)因为我们只对someFunction
和someFunction()
的布尔值评估感兴趣,因为这就是三元表达式所寻找的。
所以改变你的代码:
return (
<div>
{
hasCookies()
? <NewRSSForm
createRSSFeed={createRSSFeed}
createRSSFeedSuccess={createRSSFeedSuccess}
/>
: <LoginForm
loginGoogle={loginGoogle}
loginGoogleSuccess={loginGoogleSuccess}
/>
}
</div>
)
答案 2 :(得分:0)
问题出在Redux上。访问路径时执行以下方法:
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
访问payload
,带来整个对象:
return ({hasCookies})
就像那样,它就像这样返回它,我正在测试Object,而不是它的值:
hasCookies: {
hasCookies: true/false
}