DEV Community


Discussion on: Can you help me review my MEN stack app?

alexanderjanke profile image
Alex Janke

Looks pretty good so far and I couldn't see any real issues when glancing at the code. So good job for that!

To your question to make the app more production-level:

  • Add linting
  • Add unit tests like AvaJs ( for the backend
  • Add E2E tests for the UI. Highly recommend Cypress (
  • This is a pretty small app but consider TypeScript as a future option
  • Use input validation on routes as a middleware, for example (biased opinion because my brother wrote the package but it's dead simple to use as a validation middleware in express). One example in your code would be here where you access req.notes_data_id but it is nowhere assured that this isn't undefined

So with the package you could then say:

import { connect } from "@dotvirus/yxc";"/home",
  body: yxc.object({
      notes_data: yxc.string().notEmpty()
async (req, res) => {
        Notes.findById(req.body.notes_data._id, async (err, note) => {

This would throw a 400 to your express-error-handler whenever the request wasn't met, thus completely skipping the express-route-body and you are ensured that all your variables you get from req are actually there :)

kretaceous profile image
Abhijit Hota Author • Edited

Hey! Thank you for taking your time to write this. 😄
I will surely try to follow the tips you suggested.

I honestly had no idea that we can 'add' linting to our applications. I just have ESLint installed as an extension in VSCode and that helps me a lot. Will look into it.
I still don't know what exactly unit testing is and how tests are supposed to be 'written' but I've been thinking to learn more about it. Will check out Ava and Cypress after I know what they really are.
I appreciate the feedback on adding input validation as a middleware. 😄

Again, thanks for the info!

alexanderjanke profile image
Alex Janke

When adding eslint into your project you ensure that everyone uses the same settings. If you change your VsCode-settings and I want to collaborate to your repo - how do I get your lint-settings? ;)

Okay for unit tests it's pretty simple. You write code that tests your code. Imagine you have a function that adds two values

function add(first, second) {
  return first + second;

To test your function with ava you could then say something like

  you define what the result of your function SHOULD be.
  If your implementation of the add function was broken, 
  this would return an error telling you exactly what is wrong.
test("add function returns 3", t => {, 2), 3); // <-- this passes because 1+2 does indeed equal 3.
  // The line can be read as "Please ensure that the result of add(1, 2) equals 3"

I hope it makes sense!

Cypress is purely for UI to help you simulate user inputs. You could write cypress-tests that click a textbox, enter a specific text and hit your sign-in button. All automated.

Thread Thread
kretaceous profile image
Abhijit Hota Author

Thanks a lot for explaining the concepts!
I'll definitely try to implement them.