You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RavenDB中JavaScript索引执行方法及索引无效报错排查

RavenDB JavaScript索引问题解答

一、Products_ByCategoryName_JS索引的执行位置与引入方式

1. 引入方式

将索引类放在单独文件(比如products-index.js)中并导出:

import { AbstractJavaScriptIndexCreationTask } from "ravendb";

export class Products_ByCategoryName_JS extends AbstractJavaScriptIndexCreationTask {
    constructor () {
        super();

        const { load } = this.mapUtils();

        this.map("Products", product => {
            return {
                categoryName: load(product.Category, "Categories").Name
            };
        });
    }
}

在需要使用的模块中导入:

import { Products_ByCategoryName_JS } from './products-index.js';

2. 执行位置

索引的execute方法需在RavenDB DocumentStore初始化完成后调用,建议放在应用启动阶段(比如服务器启动初始化代码),无需每次请求执行,仅启动时执行一次即可:

// store为已初始化的DocumentStore实例
await new Products_ByCategoryName_JS().execute(store);

二、Users_ByName索引报错原因排查

报错InvalidArgumentException: Map is required to generate an index, you cannot create an index without a valid Map property (in index Users/ByName)的核心原因及修正方案如下:

1. Map语法错误

你直接用字符串模板赋值给this.map,这是RavenDB C#索引的写法,JavaScript索引需通过this.map()方法定义映射逻辑,而非字符串赋值。

2. 索引名称与查询不匹配

索引类名为Users_ByName,RavenDB默认生成的索引名称是Users/ByName,但你查询时写了UsersData/ByName,导致查询找不到目标索引。

3. 索引字段与查询字段不匹配

索引中定义的是Name(首字母大写),但查询时用了name(小写),字段名称不匹配会导致查询无结果。

修正后的Users_ByName索引类

// @ts-nocheck
import { AbstractJavaScriptIndexCreationTask } from "ravendb";

export class Users_ByName extends AbstractJavaScriptIndexCreationTask {
  constructor () {
      super();

      // 使用this.map()方法定义集合映射
      this.map("UsersData", user => {
          return {
              Name: user.name
          };
      });
  }
}

修正后的查询代码

app.get('/', async (req, res) => {
  try {
    // 索引执行移至应用启动阶段,避免重复执行
    // await new Users_ByName().execute(store); 

    const session = store.openSession();
    // 使用正确的索引名称,或直接传入索引类更可靠
    const queryOnIndex = session.query({ indexName: 'Users/ByName' })
      .whereEquals('Name', 'Johnse');

    const data = await queryOnIndex.all();
    res.json(data);
  } catch(e) {
    console.error(e);
    res.status(500).send(e.message);
  }
});

额外建议

  • 查询时可直接传入索引类,避免手动写名称出错:
    const queryOnIndex = session.query({ indexType: Users_ByName })
      .whereEquals('Name', 'Johnse');
    

内容的提问来源于stack exchange,提问作者lambdamaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:55:01