Nodejs 调用 dubbo 接口报错

发布于 1周前 作者 yuanlaile 来自 nodejs/Nestjs

Nodejs 调用 dubbo 接口报错
如题,对 nodejs 还不熟悉。按这里的指引,尝试用 dubbo-js 调用 dubbo-samples 的 sayhello 接口。一共两个文件,dubbo-test.ts 的内容如下
<br>import { Dubbo } from 'apache-dubbo-consumer'<br>import { Zk} from 'apache-dubbo-registry'<br>import {HelloService} from './service'<br><br>const dubbo = new Dubbo&lt;typeof HelloService&gt;({<br> application: {name: 'dubbo-node-bff'}, // 标记调用方,信息存储在注册中心,方便排查问题<br> registry: Zk({ connect: '192.168.1.122:2181' }), // 以 Zk 作为注册中心,详细的初始化参考 @<a target="_blank" href="/member/apache" rel="nofollow noopener">apache</a>/dubbo-registry 的 api<br> services:HelloService, // 代理的服务 // boolean 可选参数 是否开启对 dubbox 的支持<br> dubboInvokeTimeout:15, // number 可选参数 最大超时时间 默认 5s<br> // string 可选参数 设置 dubbo 版本<br> // 设置调用元数据 可选参数<br>});<br>//main method<br>dubbo.service.HelloService.sayHello('dd');<br>
service.ts 的内容如下:
<br>import { Dubbo, TDubboCallResult } from 'apache-dubbo-consumer'<br><br>// 获取更好的代码提示<br>export interface IHelloService {<br> sayHello(name: string): TDubboCallResult&lt;string&gt;<br>}<br><br>export const HelloService = (dubbo: Dubbo) =&gt; <br> dubbo.proxyService&lt;IHelloService&gt;({<br> dubboInterface: 'org.apache.dubbo.service.HelloService',<br> methods: {<br> sayHello(name: string) {<br> return [name] // 此处为代理方法,不需要具体的实现,我们只需要将参数透传即可,这样 dubbo-consumer 就可以获取完整的服务信息<br> }<br> }<br> })<br>
但是运行一直报错:Property ‘HelloService’ does not exist on type ‘TDubboService<(dubbo: Dubbo<Object>) => IHelloService>’.
这是要什么修改呢?希望大家能够多多指点


4 回复

new Dubbo 接受的泛型应该是一个对象来的,services 的值也一样

import {HelloService} from ‘./service’
改成
import services from './service.mjs’

services:HelloService
改成
services,

export const HelloService = (dubbo: Dubbo) =>
改成
const HelloService = (dubbo: Dubbo) =>

同时在最后 exportdefault 一个包含 HelloService 的对象:
export default {
HelloService
}


非常感谢您!按你所说的去改,确实可以执行了,但是报错:res: null,
err: DubboDecodeError: only support hessian serialization

apache-dubbo-consumer improt 一个 java 进来,然后将 return [name] 改成 return [java.String(name)]

PS: 如没必要,真的不建议去用这个东西。

在 Node.js 中调用 Dubbo 接口通常需要通过一些中间件或者框架来实现,因为 Dubbo 本身是一个基于 Java 的 RPC 框架。常见的解决方案包括使用 Dubbo 提供的 Node.js 客户端(如果有的话),或者通过 HTTP 网关(如 Apache Dubbo 的 Dubbo-go-proxy)来间接调用 Dubbo 服务。

如果你遇到了报错,这里有几个可能的解决步骤和检查点:

  1. 检查 Dubbo 服务是否可达: 确保 Dubbo 服务正在运行,并且网络配置(如 IP 和端口)正确无误。

  2. 使用 Dubbo-go-proxy: 如果你选择通过 HTTP 网关来调用 Dubbo 服务,确保 Dubbo-go-proxy 已经正确配置并启动。

    示例代码(使用 axios 发起 HTTP 请求):

    const axios = require('axios');
    
    axios.post('http://<proxy-host>:<proxy-port>/dubbo/<service>/<method>', {
        // 请求参数
    }, {
        headers: {
            'Content-Type': 'application/json'
        }
    })
    .then(response => {
        console.log(response.data);
    })
    .catch(error => {
        console.error('Error calling Dubbo service:', error);
    });
    
  3. 查看错误日志: 检查 Node.js 和 Dubbo 服务端的日志,找到具体的错误信息,这有助于确定问题的根源。

  4. 检查依赖和版本兼容性: 确保你使用的所有库和框架版本都兼容,并且没有已知的 bug。

如果以上步骤无法解决问题,你可能需要提供更详细的错误信息以便进一步分析。

回到顶部