Javascript 此函数仅在服务器重新启动时起作用

Javascript 此函数仅在服务器重新启动时起作用,javascript,node.js,Javascript,Node.js,我有一个在运行节点服务器时运行的函数。第二次刷新页面时会抛出错误。重新启动节点服务器并第三次刷新页面时,该功能将再次工作 我有很多人 const members = [{ imgUrl: 'resources/members/foobar.png', name: 'Foo Bar', focus: [0, 1, 2, 4, 5] }, { imgUrl: 'resources/members/barfoo.png', name: 'Bar Foo',

我有一个在运行节点服务器时运行的函数。第二次刷新页面时会抛出错误。重新启动节点服务器并第三次刷新页面时,该功能将再次工作

我有很多人

const members = [{
    imgUrl: 'resources/members/foobar.png',
    name: 'Foo Bar',
    focus: [0, 1, 2, 4, 5]
}, {
    imgUrl: 'resources/members/barfoo.png',
    name: 'Bar Foo',
    focus: [0, 1, 2, 4, 5]
}, {
    imgUrl: 'resources/members/johndoe.png',
    name: 'John Doe',
    focus: [1, 3, 5]
}];
我想修改这个数组

const targetMembers = members.map(member => {
    member.focus = member.focus.map(skillIndex => skills[skillIndex]).join(', ');
    return member;
});
我得到的错误是

TypeError: member.focus.map is not a function
    at members.map.member (C:\Users\...\...\server\routes\main.js:6:37)
    at Array.map (<anonymous>)
    at router.get (C:\Users\...\...\server\routes\main.js:5:35)
    at Layer.handle [as handle_request] (C:\Users\...\...\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\...\...\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\...\...\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\...\...\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\...\...\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\...\...\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\...\...\node_modules\express\lib\router\index.js:275:10)

问题在于声明

member.focus = member.focus.map(skillIndex => skills[skillIndex]).join(', ');
第一次执行-
成员。焦点
是一个
数组
,数组具有函数
映射
,并执行。但是,在执行后,您已将member.focus更改为字符串


第二次执行-
成员。焦点
是一个
字符串
,字符串没有函数映射,因此出现错误。

问题在于语句

member.focus = member.focus.map(skillIndex => skills[skillIndex]).join(', ');
第一次执行-
成员。焦点
是一个
数组
,数组具有函数
映射
,并执行。但是,在执行后,您已将member.focus更改为字符串


第二次执行-
成员。焦点
是一个
字符串
,字符串没有函数映射,因此出现错误。

这很可能是改变实际属性本身而不是映射到新属性的副作用。如果
members
被保存在内存中,并试图以某种方式再次运行它,
focus
现在是一个字符串,它不包含
map
方法

映射到新对象,而不是修改现有对象:

const targetMembers = members.map(member => {
    return {
        ...member,
        focusString: member.focus.map(skillIndex => skills[skillIndex]).join(', ')
   } 
});

这很可能是改变实际属性本身而不是映射到新属性的副作用。如果
members
被保存在内存中,并试图以某种方式再次运行它,
focus
现在是一个字符串,它不包含
map
方法

映射到新对象,而不是修改现有对象:

const targetMembers = members.map(member => {
    return {
        ...member,
        focusString: member.focus.map(skillIndex => skills[skillIndex]).join(', ')
   } 
});

您正在将焦点从数组更改为字符串。字符串没有
map
函数,但为什么它在first try=”上一直工作?因为当您第一次运行它时,
focus
仍然是一个数组。运行
const targetMembers=members.map(member…
后,
.join()
在执行
member.focus=…
之前将数组转换为字符串,然后将其替换为
.join(',')产生的字符串
。您似乎希望此操作在
成员
对象的副本上运行。对象不会自动复制。您正在将
焦点
从数组更改为字符串。字符串没有
映射
功能,但为什么它在第一次尝试时始终有效=?因为当您第一次运行它时,
焦点
是st我将创建一个数组。一旦运行
const targetMembers=members.map(member…
the
.join()
将数组转换为字符串,然后再执行
member.focus=…
这是一个数组。之后,将其替换为
.join(',')生成的字符串
。您似乎希望此操作在
成员
对象的副本上进行。对象不会自动复制。如果要复制,为什么要对字符串使用不同的属性名?我想这是“从不更改数据,添加到数据”的好方法。将来可能仍然需要
focus
属性。如果要复制,为什么要为字符串使用不同的属性名称?我想这是“永不更改数据,添加到数据”的好方法。将来可能仍然需要
focus
属性。