I am trying to connect my medusa application with adminbro to get a better understanding the relationships I will create between my entities. And I am getting this error
/Users/priyabihani/Documents/medusa/openboxkar_medusa/node_modules/admin-bro/lib/backend/utils/resources-factory/resources-factory.js:99
throw new NoResourceAdapterError(resourceObject);
^
NoResourceAdapterError: There are no adapters supporting one of the resource you provided
at /Users/priyabihani/Documents/medusa/openboxkar_medusa/node_modules/admin-bro/lib/backend/utils/resources-factory/resources-factory.js:99:15
at Array.map (<anonymous>)
at ResourcesFactory._convertResources (/Users/priyabihani/Documents/medusa/openboxkar_medusa/node_modules/admin-bro/lib/backend/utils/resources-factory/resources-factory.js:93:22)
at ResourcesFactory.buildResources (/Users/priyabihani/Documents/medusa/openboxkar_medusa/node_modules/admin-bro/lib/backend/utils/resources-factory/resources-factory.js:48:35)
at new AdminBro (/Users/priyabihani/Documents/medusa/openboxkar_medusa/node_modules/admin-bro/lib/admin-bro.js:101:39)
at start (/Users/priyabihani/Documents/medusa/openboxkar_medusa/index.js:20:22)
at /Users/priyabihani/Documents/medusa/openboxkar_medusa/index.js:71:9
at Object.<anonymous> (/Users/priyabihani/Documents/medusa/openboxkar_medusa/index.js:72:3)
at Module._compile (node:internal/modules/cjs/loader:1103:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1157:10) {
resource: [class Product extends Product]
}
I am trying to connect medusa with admin bro to get a better understanding of the relationships I will create.
I find out that I can run my the index.js file in my root by using npm run start:custom
, in index.js file I can add the adminbro adapter and user adminbro router. Also I am getting my products from the dist folder that was compiled from my source folder.
package.json file
{
"name": "medusa-starter-default",
"version": "0.0.1",
"description": "A starter for Medusa projects.",
"author": "Medusa (https://medusajs.com)",
"license": "MIT",
"keywords": [
"sqlite",
"postgres",
"typescript",
"ecommerce",
"headless",
"medusa"
],
"scripts": {
"clean": "cross-env ./node_modules/.bin/rimraf dist",
"build": "cross-env npm run clean && npm run build:server && npm run build:admin",
"build:server": "cross-env npm run clean && tsc -p tsconfig.server.json",
"build:admin": "cross-env medusa-admin build",
"watch": "cross-env tsc --watch",
"test": "cross-env jest",
"seed": "cross-env medusa seed -f ./data/seed.json",
"start": "cross-env npm run build && medusa start",
"start:custom": "cross-env npm run build && node --preserve-symlinks --trace-warnings index.js",
"dev": "cross-env npm run build:server && medusa develop",
"dev:custom": "cross-env npm run build:server && nodemon --watch src/* --preserve-symlinks --trace-warnings index.js"
},
"dependencies": {
"@admin-bro/express": "^3.1.0",
"@admin-bro/typeorm": "^1.4.0",
"@medusajs/admin": "7.1.8",
"@medusajs/cache-inmemory": "^1.8.9",
"@medusajs/cache-redis": "^1.8.9",
"@medusajs/event-bus-local": "^1.9.7",
"@medusajs/event-bus-redis": "^1.8.10",
"@medusajs/file-local": "^1.0.2",
"@medusajs/medusa": "1.18.1",
"@tanstack/react-query": "4.22.0",
"admin-bro": "^3.3.1",
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"dotenv": "16.3.1",
"express": "^4.17.2",
"medusa-fulfillment-manual": "^1.1.38",
"medusa-interfaces": "^1.3.7",
"medusa-payment-manual": "^1.0.24",
"medusa-payment-stripe": "^6.0.5",
"prism-react-renderer": "^2.0.4",
"reflect-metadata": "^0.2.1",
"typeorm": "^0.3.16"
},
"devDependencies": {
"@babel/cli": "^7.14.3",
"@babel/core": "^7.14.3",
"@babel/preset-typescript": "^7.21.4",
"@medusajs/medusa-cli": "^1.3.21",
"@types/express": "^4.17.13",
"@types/jest": "^27.4.0",
"@types/node": "^17.0.8",
"babel-preset-medusa-package": "^1.1.19",
"cross-env": "^7.0.3",
"eslint": "^6.8.0",
"jest": "^27.3.1",
"nodemon": "^3.0.2",
"rimraf": "^3.0.2",
"ts-jest": "^27.0.7",
"ts-loader": "^9.2.6",
"typescript": "^4.5.2"
},
"jest": {
"globals": {
"ts-jest": {
"tsconfig": "tsconfig.spec.json"
}
},
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"testPathIgnorePatterns": [
"/node_modules/",
"<rootDir>/node_modules/"
],
"rootDir": "src",
"testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|js)$",
"transform": {
".ts": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "./coverage",
"testEnvironment": "node"
}
}
index.js file
require("reflect-metadata");
const express = require("express");
const AdminBro = require("admin-bro");
const AdminBroExpress = require("@admin-bro/express");
const { Product } = require("./dist/models/product.js");
const { Database, Resource } = require("@admin-bro/typeorm");
const { GracefulShutdownServer } = require("medusa-core-utils");
const loaders = require("@medusajs/medusa/dist/loaders/index").default;
(async () => {
async function start() {
const app = express();
const directory = process.cwd();
console.log("============", directory);
AdminBro.registerAdapter({ Database, Resource });
const adminBro = new AdminBro({
resources: [
{
resource: Product,
},
],
rootPath: "/adminbro",
});
const adminBroRouter = AdminBroExpress.buildRouter(adminBro);
try {
console.log(app);
const { container } = await loaders({
directory,
expressApp: app,
});
const configModule = container.resolve("configModule");
const port = process.env.PORT ?? configModule.projectConfig.port ?? 9000;
const server = GracefulShutdownServer.create(
app.listen(port, (err) => {
if (err) {
return;
}
console.log(`Server is ready on port: ${port}`);
app.use(adminBro.options.rootPath, adminBroRouter);
})
);
// Handle graceful shutdown
const gracefulShutDown = () => {
server
.shutdown()
.then(() => {
console.info("Gracefully stopping the server.");
process.exit(0);
})
.catch((e) => {
console.error("Error received when shutting down the server.", e);
process.exit(1);
});
};
process.on("SIGTERM", gracefulShutDown);
process.on("SIGINT", gracefulShutDown);
} catch (err) {
console.error("Error starting server", err);
process.exit(1);
}
}
await start();
})();
Also in my src/models/product file where I am actually defining/extending the schema:
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
import { Product as MedusaProduct } from "@medusajs/medusa";
import { Store } from "./store";
@Entity("product")
export class Product extends MedusaProduct {
@Index("ProductStoreId")
@Column({ nullable: true })
store_id?: string;
@ManyToOne(() => Store, (store) => store.products)
@JoinColumn({ name: "store_id", referencedColumnName: "id" })
store?: Store;
}
Can anyone help?