Node.js 10.18 or later is required, matching the engines field in the
package’s package.json.
npm install thrift
You can compile IDL sources for Node.js with the following command:
thrift --gen js:node thrift_file
Here is a Cassandra example:
var thrift = require('thrift'),
Cassandra = require('./gen-nodejs/Cassandra')
ttypes = require('./gen-nodejs/cassandra_types');
var connection = thrift.createConnection("localhost", 9160),
client = thrift.createClient(Cassandra, connection);
connection.on('error', function(err) {
console.error(err);
});
client.get_slice("Keyspace", "key", new ttypes.ColumnParent({column_family: "ExampleCF"}), new ttypes.SlicePredicate({slice_range: new ttypes.SliceRange({start: '', finish: ''})}), ttypes.ConsistencyLevel.ONE, function(err, data) {
if (err) {
// handle err
} else {
// data == [ttypes.ColumnOrSuperColumn, ...]
}
connection.end();
});
Since JavaScript represents all numbers as doubles, int64 values cannot be accurately represented naturally. By default, both the protocol layer (TBinaryProtocol.readI64() etc.) and generated struct fields surface int64 values as broofa/node-int64 Thrift.Int64 objects. See BigInt mode below for the opt-in alternative — which changes only the generated-code field type and keeps the protocol layer unchanged.
js:bigint, opt-in)Native BigInt has been available since Node 10.4, so every supported runtime
can use it. Pass bigint alongside node in the generator option list to
emit BigInt-aware code instead of node-int64:
thrift --gen js:node MyService.thrift # default — node-int64 output
thrift --gen js:node,bigint MyService.thrift # opt-in — native BigInt output
When the bigint flag is set, code generated by --gen js:node (and the
ts, es6, esm variants):
bigint literals (e.g. 42n, 9223372036854775807n) for
int64 constants instead of new Int64(42).require('node-int64') / import Int64 from 'node-int64'
preamble.bigint in .d.ts files instead of Int64.readI64() calls with thrift.toBigInt(...) so deserialized
fields land in the generated struct as bigint, and writeI64(...)
calls with thrift.fromBigInt(...) so consumers can pass plain
bigint values into their structs.The flag is only meaningful when node is in the option list; passing
bigint to plain --gen js (browser JS) is silently ignored.
TBinaryProtocol itself is unchanged — readI64 still returns a
Thrift.Int64 and writeI64 still expects one. The BigInt boundary lives
entirely in the JS layer, in the two helpers exported from the thrift
package:
const thrift = require("thrift");
const big = thrift.toBigInt(prot.readI64()); // Int64 -> bigint
prot.writeI64(thrift.fromBigInt(big)); // bigint -> Int64
thrift.fromBigInt wraps values to the signed 64-bit range
(BigInt.asIntN(64, ...)) and accepts bigint, decimal-string, or number
input. Existing code that imports Thrift.Int64 or calls prot.readI64()
directly keeps working with no changes.
Several example clients and servers are included in the thrift/lib/nodejs/examples folder and the cross language tutorial thrift/tutorial/nodejs folder.
You can use code generated with js:node on browsers with Webpack. Here is an example.
thrift –gen js:node,ts,es6,with_ns
import * as thrift from 'thrift';
import { MyServiceClient } from '../gen-nodejs/MyService';
let host = window.location.hostname;
let port = 443;
let opts = {
transport: thrift.TBufferedTransport,
protocol: thrift.TJSONProtocol,
headers: {
'Content-Type': 'application/vnd.apache.thrift.json',
},
https: true,
path: '/url/path',
useCORS: true,
};
let connection = thrift.createXHRConnection(host, port, opts);
let thriftClient = thrift.createXHRClient(MyServiceClient, connection);
connection.on('error', (err) => {
console.error(err);
});
thriftClient.myService(param)
.then((result) => {
console.log(result);
})
.catch((err) => {
....
});
Bundlers, like webpack, will use thrift/browser.js by default because of the
"browser": "./lib/nodejs/lib/thrift/browser.js" field in package.json.
import thrift from 'thrift';
import { MyServiceClient } from '../gen-nodejs/MyService';
const host = window.location.hostname;
const port = 9090;
const opts = {
transport: thrift.TBufferedTransport,
protocol: thrift.TBinaryProtocol
}
const connection = thrift.createWSConnection(host, port, opts);
connection.open();
const thriftClient = thrift.createWSClient(MyServiceClient, connection);
connection.on('error', (err) => {
console.error(err);
});
thriftClient.myService(param)
.then((result) => {
console.log(result);
})
.catch((err) => {
....
});